C语言------字符函数和字符串函数
一.字符分类函数
1.功能:
专门做字符分类的函数,也就是判断字符属于什么类型,这些函数都需要包含一个头文件从**ctype.h**
函数 | 如果它的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格'',换页'\f',回车'\r',制表符'\t'或者垂直制表符'\v' |
isdigit | 十进制数字,'0'~'9'字符 |
isxdigit | 十六进制数字,包括所有十进制数字字符,小写字母a~f ,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z 或 A~Z |
isalnum | 字母或者数字,a~z, A~Z, 0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白符 |
2.字符分类函数的应用
写一个代码,将字符串中的小写字母转为大写,其他字符不变
c
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "I love CSDN.";
int i = 0;
while (arr[i] != '\0')
{
if (islower(arr[i]))
arr[i] -= 32;//小写字母转大写
printf("%c", arr[i]);
i++;
}
return 0;
}
运行:
二.字符转换函数
1.功能
该函数适用于大小写字母的转换
c
int tolower(int c);
//将参数传进去的大写字母转小写
int toupper(int c);
//将参数传进去的小写字母转大写
2.应用
c
#include<stdio.h>
#include<ctype.h>
int main()
{
int r = toupper('a');
printf("%c\n", r);
return 0;
}

三.strlen函数
基本实现
- 在之前的笔记有提到过strlen函数,其基本形式:
c
size_t strlen (const char* str)
- 功能:统计参数str指向的字符串的长度。统计的是字符串中'\0'之前的字符的个数,若是没有'\0',返回的可能就是一个随机值
- 参数:str:指针,指向了要统计长度的字符串
- 返回值:返回了str指向的字符串的长度,返回的长度不会是负数,所以返回类型是size_t(无符号整型)
- 使用
- 举例一
c
#include<stdio.h>
#include<string.h>
int main()
{
size_t len=strlen("abcdef");
printf("%zu\n",len);
return 0;
}

- 举例二
c
#include<stdio.h>
#include<string.h>
int main()
{
if (strlen("abcd") - strlen("abcdefg") > 0)
//4 7
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
- 注意这里,strlen("abcd")和strlen("abcdefg")算出的结果返回类型都是size_t(无符号整型),故而它们相减的结果也会被认为是size_t类型的,所以计算结果不是-3而是3,因而结果是>
- 例如-3,因为系统认为是无符号整型,所以会把它的补码当作源码来对待,如:
-3的原码:10000000000000000000000000000011
-3的反码:11111111111111111111111111111100
-3的补码:11111111111111111111111111111101
它的补码就是一个非常大的正数

strlen函数的模拟实现
不创建临时变量,求字符串长度
c
#include<stdio.h>
#include<string.h>
size_t my_strlen(const char* str)//这里通过传参str得到数组首元素的地址
{
if (*str != '\0')
return 1 + my_strlen(str + 1);//函数递归
else
return 0;
}
int main()
{
char arr[] = "abc";
size_t len = my_strlen(arr);
printf("%zu\n", len);
return 0;
}

四.strcpy字符串拷贝函数
基本实现
- 代码块:
c
char* strcpy(char* destination,const char* source)
- 功能:字符串拷贝,拷贝到源头字符传中的\0位置
- 参数:destination:指针,指向目的地空间
source:指针,指向源头数据 - 返回值:strcpy函数返回的目标空间的起始地址
- 使用:
- 举例:
c
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello word";
char arr2[20] = { 0 };
strcpy(arr2, arr1);
printf("%s\n", arr2);
//写法二:
/*char* ret=strcpy(arr2, arr1);
printf("%s\n", ret);*/
return 0;
}
注意数组名是地址,地址是一个编号,地址是常量值不能被修改,地址指向空间,但地址不是空间
使用注意事项:
- 源字符串必须以'\0'结束;
- 会将源字符串中的'\0'拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须修改
strcpy函数的模拟实现
c
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);//断言一下,dest和src都不能为空指针
while (*dest++ = *src++)//既能完成\0前字符的拷贝也能完成\0的拷贝
{
;
}
return ret;//返回目标空间的起始地址
}
int main()
{
char arr1[] = "hello world";
char arr2[20] = "xxxxxxxxxxxxxxxxx";
char* r= my_strcpy(arr2, arr1);
printf("%s\n", arr2);
printf("%s\n", r);
return 0;
}

五.strcat字符串拼接函数
基本使用
c
char* strcat(char* destination,const char* source);
- 功能:字符串拼接,把source指向的源字符串都拼接到destination指向的空间中
- 返回值:strcat函数返回的目标空间的起始地址
- 使用:
- 示例:
c
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}

strcat函数的模拟实现
模拟思想是先找到目标空间的字符串末尾(\0);然后从\0的位置开始向后追加
c
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
//找目标空间的\0
while (*dest != '\0')
dest++;
//拷贝
while (*dest++ = *src++);
return ret;
}
int main()
{
char arr1[20] = "hello\0xxxxxxxxx";
char arr2[] = "world";
char* r = my_strcat(arr1, arr2);
printf("%s\n", arr1);
printf("%s\n", r);
return 0;
}

六.strcmp字符串比较函数
基本使用
c
int strcmp(const char*str1,const char* str2);
- 功能:比较str1和str2指向的字符串,从两个字符串的第一个字符开始比较,如果两个字符的ASCII码值相等就比较下一个字符。直到遇到不相等的字符,或者字符串结束
- 返回值(标准规定):
- 第一个字符串大于第二个字符串,返回大于0的数字
- 第一个字符串等于第二个字符串,返回0
- 第一个字符串小于第二个字符串,返回小于0的数字
- 举例:
c
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
int r = strcmp(arr1, arr2);
if (r > 0)
printf("arr1>arr2\n");
else if(r<0)
printf("arr1<arr2\n");
else
printf("arr1=arr2\n");
return 0;
}

strcmp函数的模拟实现
c
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1&&str2);
while (*str1 == *str2)
{
if (*str1 == '\0')//判断相等的情况
return 0;
str1++;
str2++;
}
if (*str1 > *str2)//大于
return 1;
else//小于
return -1;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
int r = my_strcmp(arr1, arr2);
if (r > 0)
printf("arr1>arr2\n");
else if (r < 0)
printf("arr1<arr2\n");
else
printf("arr1=arr2\n");
return 0;
}

七.strncpy函数
之前学过的strcpy,strcat,strcmp函数均是长度不受限制的字符串函数
而后面要学到的strncpy,strncat,strncmp函数均是长度受限制的字符串函数
基本使用:
- 使用格式:
c
char* strncpy(char* destination,const char* source,size_t num);
- 功能:
字符串拷贝 ,将source指向的字符串拷贝到destination指向的空间中,最多拷贝num个字符 - 举例:
- 注意:strcpy函数拷贝到\0为止,若目标空间不够,易出现越界;而strncpy函数指定了拷贝长度,源字符串不一定需要有\0,所以该函数相比来说更安全一些。
八.strncat函数
基本使用
- 代码格式:
c
char* strcat(char* destination,const char* source);
- 功能:字符串追加,将source指向的字符串内容,追加到destination指向的空间,最多追加num个字符
- 举例:
- 注意:strcat函数拼接时需将源字符串全部包括\0都包含,但是strncat函数指定了追加的长度,所以源字符串不一定有\0。
九.strncmp函数
基本使用
1.代码格式:
c
int strncmp(const char* str1,const char* str2);
- 功能:字符串比较,比较str1和str2指向的两个字符串的内容,最多比较num字符
- 举例:
- 注意:返回值规则与strcmp函数基本相似,但是strncmp可以比较任意长度的字符串
十.strstr函数
基本使用
c
char* strstr(const char* str1,const char* strs);
- 功能:查找str2指向的字符串在str1指向的字符串中第一次出现的位置
- 返回值:如果str1指向的字符串中存在str2指向的的字符串,那么返回第一次出现的位置的指针;
如果str1指向的字符串中不存在str2指向的的字符串,那么返回NULL - 代码实现:
strstr函数的模拟实现
c
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1&&str2);
const char* p = str1;
const char* s1 = NULL;
const char* s2 = NULL;
//特殊场景的处理
if (*str2 == '\0')
return (char*)str1;
while (*p)//枚举查找的次数
{
s1 = p;
s2 = str2;
//找一次的匹配过程
while(*s1 && *s2 && *s1==*s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)p;
p++;
}
return NULL;
}
int main()
{
char arr1[] = "abccdefghijklmnop";
char arr2[] = "def";
char* p = my_strstr(arr1, arr2);
if (p != NULL)
{
printf("找到了,%s\n", p);
}
else
{
printf("找不到\n");
}
return 0;
}

十一.strtok函数
c
char *strtok(char* str,const char* delim);
- 功能:分割字符串 (根据delim参数中指定的分隔符,将输入字符串str拆分成多个子字符串),修改原始字符串(strtok会直接在原始字符串中插入'\0'终止符,替换分隔符的位置,因此原始字符串会被修改)
- 返回值:
- 成功时返回指向当前子字符串的指针
- 没有更多子字符串时返回NULL
- 使用步骤:
- 首次调用:传入待分割字符串和分隔符
- 后续调用:传入NULL和相同的分隔符,继续分割
- 结束条件:当返回NULL时表示分割完成
- 功能演示:
- 注意事项:
- 破坏性操作:strtok会直接修改原始字符串,将其中的分隔符替换为'\0',如果需要保留原字符串,应该先拷贝一份
- 连续分隔符:多个连续分隔符会被视为单个分隔符,不会返回空字符串
- 空指针处理:如果输入的str为NULL且没有前序调用,行为未定义
十二.strerror函数
C语言的库函数在使用的时候,如果发生了错误会将一个错误码记录到errno的变量中
基本使用
- 函数的使用:
c
char* strerror(int errnum);
- 功能
- strerror函数可以通过参数部分的errnum表示错误代码,得到对应的错误信息,并且返回这个错误字符串首字符的地址
- strerror函数只针对标准库中的函数发生错误后设置的错误码的转换
- strerror的使用需要包含<string.h>
- 使用
perror函数
该函数相当于代替了printf和strerror两个函数步骤,直接将错误信息打印出来
c
void perror(const char* str);
- 使用:
本次内容到这里就结束了
谢谢观看若有不足欢迎在评论区讨论。