• (c语言进阶)字符串函数、字符分类函数和字符转换函数


    一.求字符串长度

    1.strlen()

    (1)基本概念

    头文件:

    (2)易错点:strlen()的返回值为无符号整形

    1. #include
    2. #include
    3. int main()
    4. {
    5. const char* str1 = "abcdef";
    6. const char* str2 = "bbb";
    7. printf("%u\n", strlen(str2) - strlen(str1));
    8. printf("%d\n", strlen(str2) - strlen(str1));
    9. return 0;
    10. }

     

    两个strlen函数的返回值相减,得到的结果为无符号整数的形式

    1. #include
    2. #include
    3. int main()
    4. {
    5. const char* str1 = "abcdef";
    6. const char* str2 = "bbb";
    7. if (strlen(str2) - strlen(str1) > 0)
    8. {
    9. printf(">\n");
    10. }
    11. else
    12. {
    13. printf("<\n");
    14. }
    15. return 0;
    16. }

     (3)模拟实现

    1. #include
    2. #include
    3. size_t my_strlen(const char* str1)
    4. {
    5. size_t count=0;
    6. while (*str1++)
    7. {
    8. count++;
    9. }
    10. return count;
    11. }
    12. int main()
    13. {
    14. const char* str1 = "abcdef";
    15. size_t len=my_strlen(str1);
    16. printf("%u",len);
    17. return 0;
    18. }

    二.长度不受限制的字符串函数

    1.strcpy()——将源字符串复制给目标字符串

    (1)基本概念

    头文件:

    1. #include
    2. #include
    3. int main()
    4. {
    5. char name[20] = {0};
    6. //目标字符串的空间要足够大,否则会出现数组越界现象
    7. char arr[20] = "hhhhhhhhhh";
    8. strcpy(name,arr);
    9. //arr为字符串首元素的地址
    10. //strcpy(目标字符串首元素地址,字符串常量首元素地址)
    11. //'\0'也会被复制到目标字符串
    12. printf("%s\n",name);
    13. strcpy(name,"ycy");
    14. printf("%s",name);
    15. return 0;
    16. }

    (2)易错点:目标空间不够大时,字符串的复制还是会进行,代价是通过数组越界来实现的

    (3)模拟实现

    1. #include
    2. #include
    3. #include
    4. char* my_strcpy(char* name,char* arr)
    5. {
    6. assert(name&&arr);
    7. char* p = name;
    8. while (*name++=*arr++) //赋值语句的返回值为左操作数的值,当*arr将'\0'赋值给*name时结束循环
    9. {
    10. }
    11. return p;
    12. }
    13. int main()
    14. {
    15. char name[20] = {0};
    16. char arr[20] = "hhhhhhhhhh";
    17. my_strcpy(name,arr);
    18. printf("%s",name);
    19. return 0;
    20. }

     

    2.strcat()——字符串追加

     (1)基本概念

    头文件

     (2)模拟实现

    1. #include
    2. #include
    3. #include
    4. char* my_strcat(char* arr1,char* arr2)
    5. {
    6. char* p = arr1;
    7. //将地址移动至\0处
    8. while (*arr1)
    9. {
    10. arr1++;
    11. }
    12. //从\0处开始拷贝arr2
    13. //h e l l o \0——arr1
    14. // w o r l d \0——arr2
    15. //h e l l o w o r l d \0 ——追加后的arr1
    16. while (*arr1++ = *arr2++)
    17. {
    18. }
    19. return p;
    20. }
    21. int main()
    22. {
    23. char arr1[20] = "hello";
    24. char arr2[20] = " world";
    25. my_strcat(arr1,arr2);
    26. printf("%s",arr1);
    27. return 0;
    28. }

    3.strcmp()——字符串比较

    (1)基本概念

    头文件 

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr1[20] = "hello";
    7. char arr2[20] = "world";
    8. int p=strcmp(arr1,arr2);
    9. //strcmp函数会将两个字符串的每个字符依次比较
    10. //若出现不相等则停止比较
    11. //前一个操作符的元素大于后一个操作符的元素,则会输出一个大于零的整数
    12. //前一个操作符的元素小于后一个操作符的元素,则会输出一个小于零的整数、
    13. //等于则输出0
    14. if (p > 0)
    15. {
    16. printf("arr1>arr2\n");
    17. }
    18. else if (p == 0)
    19. {
    20. printf("arr1==arr2\n");
    21. }
    22. else
    23. {
    24. printf("arr1);
    25. }
    26. return 0;
    27. }

     (2)模拟实现

    1. include
    2. #include
    3. #include
    4. int my_strcmp(char* arr1,char* arr2)
    5. {
    6. assert(arr1&&arr2);
    7. while (*arr1==*arr2) //相同的情况下,判断下一位是否也相同,不相同则退出循环
    8. {
    9. if (*arr1=='\0'||*arr2=='\0') //若有其中一个字符串到达末尾,则退出循环
    10. {
    11. break;
    12. }
    13. arr1++;
    14. arr2++;
    15. }
    16. return *arr1 - *arr2; //不相同则相减返回差值
    17. }
    18. int main()
    19. {
    20. char arr1[20] = "hello";
    21. char arr2[20] = "hello";
    22. int p=my_strcmp(arr1,arr2);
    23. if (p > 0)
    24. {
    25. printf("arr1>arr2\n");
    26. }
    27. else if (p == 0)
    28. {
    29. printf("arr1==arr2\n");
    30. }
    31. else
    32. {
    33. printf("arr1);
    34. }
    35. return 0;
    36. }

    三.长度受限制的字符串函数介绍

    1.strncpy() ——可控制,复制字符串元素

     (1)基本概念

    头文件 

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr1[20] = "abcdef";
    6. char arr2[] = "bit";
    7. strncpy(arr1,arr2,3);
    8. printf("%s\n",arr1);
    9. return 0;
    10. }

     (2)易错点:当要复制的元素个数大于原字符串时,多出来的位置会用\0代替

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr1[20] = "abcdef";
    6. char arr2[] = "bit";
    7. strncpy(arr1,arr2,5);
    8. printf("%s\n",arr1);
    9. return 0;
    10. }

     (3)模拟实现

    1. #include
    2. #include
    3. #include
    4. char* my_strncpy(char* arr1,char* arr2,size_t x)
    5. {
    6. assert(arr1&&arr2);
    7. char *p= arr1;
    8. int i;
    9. int len = strlen(arr2);
    10. for (i = 0; i < x; i++)
    11. {
    12. if (i>len)
    13. {
    14. *arr1++ = '\0';
    15. }
    16. else
    17. {
    18. *arr1++ = *arr2++;
    19. }
    20. }
    21. return p;
    22. }
    23. int main()
    24. {
    25. char arr1[20] = "abcdef";
    26. char arr2[] = "bit";
    27. my_strncpy(arr1,arr2,5);
    28. printf("%s\n",arr1);
    29. return 0;
    30. }

    2.strncat()——可控制,链接字符串元素

    (1)基本概念 

    头文件 

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr1[20] = "hello";
    7. char arr2[] = "bit";
    8. strncat(arr1,arr2,3);
    9. printf("%s\n",arr1);
    10. return 0;
    11. }

    (2)易错点:需要链接的元素个数小于原字符串时,会在链接相应数量元素的同时多链接一个'\0' .元素个数大于原字符串时,不会用'\0'填补

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr1[20] = "hello";
    7. char arr2[] = "bit";
    8. strncat(arr1,arr2,5);
    9. printf("%s\n",arr1);
    10. return 0;
    11. }
    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr1[20] = "hello";
    7. char arr2[] = "bit";
    8. strncat(arr1,arr2,1);
    9. printf("%s\n",arr1);
    10. return 0;
    11. }

    (3)模拟实现 

    1. #include
    2. #include
    3. #include
    4. char* my_strncat(char* arr1,char*arr2,size_t x)
    5. {
    6. assert(arr1&&arr2);
    7. int len = strlen(arr2);
    8. char* p = arr1;
    9. while (*arr1 != '\0')
    10. {
    11. arr1++;
    12. }
    13. if (x >= len)
    14. {
    15. while (*arr2)
    16. {
    17. *arr1++ = *arr2++;
    18. }
    19. }
    20. else
    21. {
    22. for (int i = 0; i < x; i++)
    23. {
    24. *arr1++ = *arr2++;
    25. }
    26. *arr1 = '\0';
    27. }
    28. return p;
    29. }
    30. int main()
    31. {
    32. char arr1[20] = "hello";
    33. char arr2[] = "bit";
    34. my_strncat(arr1,arr2,5);
    35. printf("%s\n",arr1);
    36. return 0;
    37. }

    3.strncmp()——可控制,比较字符串元素 

     (1)基本概念

    头文件 

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr1[20] = "hello";
    7. char arr2[] = "bit";
    8. int ret=strncmp(arr1,arr2,3);
    9. if (ret > 0)
    10. {
    11. printf("arr1>arr2");
    12. }
    13. else if (ret == 0)
    14. {
    15. printf("arr1==arr2");
    16. }
    17. else
    18. {
    19. printf("arr1);
    20. }
    21. return 0;
    22. }

    四.字符串查找

    1.strstr()——在一个字符串中查找另一个字符串是否存在

     (1)基本概念

    头文件 

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr1[20] = "hello bit world";
    7. char arr2[] = "bit";
    8. char*ret = strstr(arr1,arr2);//ret为寻找到字串位置的首地址
    9. if (ret == NULL)
    10. {
    11. printf("所寻找的子串不存在\n");
    12. }
    13. else
    14. {
    15. printf("%s",ret);//从地址处往后输出
    16. }
    17. return 0;
    18. }

     (2)模拟实现

    1. #include
    2. #include
    3. #include
    4. char* my_strstr(const char* str1, const char* str2)
    5. {
    6. assert(str1&&str2); //判断参数不为空
    7. const char* s1 = str1;
    8. const char* s2 = str2;
    9. const char* p = str1;
    10. while (*p) //被查找的字符串不为空
    11. {
    12. s1 = p;
    13. s2 = str2; //始终指向查找字符串的首元素地址
    14. while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) //都不为空且相等时进入循环
    15. {
    16. s1++;
    17. s2++;
    18. }
    19. if (*s2 == '\0') //如果退出循环时查找字符串到最后都是相等的,则说明查找成功
    20. {
    21. return p; //返回查找到的首地址
    22. }
    23. p++; //若查找途中存在不相同的,则被查找字符串指针向后一位
    24. }
    25. return NULL;
    26. }
    27. int main()
    28. {
    29. char arr1[20] = "hello bit world";
    30. char arr2[] = "bit";
    31. char* ret = my_strstr(arr1, arr2);//ret为寻找到字串位置的首地址
    32. if (ret == NULL)
    33. {
    34. printf("所寻找的子串不存在\n");
    35. }
    36. else
    37. {
    38. printf("%s", ret);//从地址处往后输出
    39. }
    40. return 0;
    41. }

     

    2.strtok()——切割字符串

     (1)基本概念

    头文件 

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. const char* sep = '@'; //分隔符
    7. char email[] = "zhangpengwei@bietejieyeke.com"; //被分割的字符串
    8. strtok(email,sep); //因为strtok函数会将遇到的第一个分隔符改为'\0',
    9. //并返回分隔符的指针,将改变原有字符串
    10. //__________________________________________________________________________________
    11. //若不想原有字符串被改变则采用如下操作
    12. char cp[] = {0};
    13. strcpy(cp,email);
    14. strtok(cp,sep);
    15. return 0;
    16. }

     (2)简单应用

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. const char* sep = "@."; //分隔符
    7. char email[] = "zhangpengwei@bietejieyeke.com"; //被分割的字符串
    8. char cp[30] = {0};
    9. strcpy(cp,email); //strtok函数有记忆功能,执行完后会保存上一个分隔符的地址,下一次调用时从该地址往后查找
    10. char* ret=strtok(cp,sep);
    11. printf("%s\n",ret);
    12. ret = strtok(NULL,sep); //所以除第一次调用,多次调用时不需要传入参数,所以传入NULL
    13. printf("%s\n", ret);
    14. ret = strtok(NULL, sep);
    15. printf("%s\n", ret);
    16. return 0;
    17. }

     (3)优化

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. const char* sep = "@."; //分隔符
    7. char email[] = "zhangpengwei@bietejieyeke.com"; //被分割的字符串
    8. char cp[30] = {0};
    9. strcpy(cp,email);
    10. char* ret = NULL;
    11. for (ret = strtok(cp, sep); ret != NULL; ret=strtok(NULL, sep))
    12. {
    13. printf("%s\n",ret);
    14. }
    15. return 0;
    16. }

    五.错误信息报告

    1.strerror()——返回错误码所对应的错误信息

     (1)基本概念

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. //c语言的库函数在执行失败的时候,都会设置相应的错误码
    7. //0 1 2 3 4 5 6 7 8 ......
    8. //strerror()可以返回错误码所对应的错误信息
    9. printf("%s\n", strerror(1));
    10. printf("%s\n", strerror(2));
    11. printf("%s\n", strerror(3));
    12. printf("%s\n", strerror(4));
    13. printf("%s\n", strerror(5));
    14. printf("%s\n", strerror(6));
    15. printf("%s\n", strerror(7));
    16. printf("%s\n", strerror(8));
    17. return 0;
    18. }

     (2)简单应用

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main()
    6. {
    7. //打开文件的函数为fopen()
    8. //"r"表示以读的形式打开
    9. //返回的是FILE型的指针,如果打开失败会返回空指针(NULL)
    10. FILE* pf = fopen("text.txt","r");
    11. //若打开的文件在程序路径下,可以使用相对路径(文件名)
    12. fopen("C:\\Users\\admin\\Desktop\\text2.text","r");
    13. //在其他位置要使用绝对路径,单个'\'会被识别为转义字符,所以要再加一个'\'
    14. //打开文件失败后,fopen函数会将错误码存储在errno中
    15. //errno—C语言设置的一个全局的错误码存储变量
    16. //只要发生错误,都会把错误码存在errno中—始终记录最新的错误码
    17. //调用errno需要应用头文件
    18. if (pf == NULL)
    19. {
    20. printf("%s", strerror(errno));
    21. }
    22. return 0;
    23. }

    六.字符分类函数 ——头文件

    重点:应用

    举例:isspace()——判断空白字符

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. printf("%d\n", isspace('x'));
    7. printf("%d\n", isspace(' '));
    8. return 0;
    9. }

    1、iscntrl()——判断是否是控制字符(任何控制字符)

    功能 

    判断是否是控制字符(任何控制字符)

    返回值

    若返回值为非0数字,则为控制字符,若返回0,则不是控制字符。

    2、isspace()——判断是否是空白字符

    功能:

    判断是否是空白字符(空格、换页/f、换行\n,回车\r,制表符\t或者垂直制表符\v)

    返回值:

    若返回值为非0数字,则为空白字符,若返回0,则不是空白字符。

    3、isdigit()——判断是否是十进制数字字符

    功能:

    判断是否是十进制数字字符(0-9)

    返回值:

    若返回值为非0数字,则为十进制数字字符,若返回0,则不是十进制数字字符。


    4、isxdigit()——判断是否是十六进制数字字符

    功能:

    判断是否是十六进制数字字符(包括所有十进制数字,小写字母a-f,大写字母A-F)

    返回值:

    若返回值为非0数字,则为十六进制字符,若返回0,则不是控制字符。

    5、islower()——判断是否是小写字母

    功能:

    判断是否是小写字母(a-z)

    返回值:

    若返回值为非0数字,则为小写字母字符,若返回0,则不是小写字母字符


    6、isupper()——判断是否是大写字母

    功能:

    判断是否是大写字母(A-Z)

    返回值:

    若返回值为非0数字,则为大写字母字符,若返回0,则不是大写字母字符。


    7、isalpha()——判断是否是字母字符

    功能:

    判断是否是字母字符(a-z或A-Z)

    返回值:

    返回值为非0数字则为控制字符,返回0则不是控制字符。


    8、isalnum()——判断是否是字母字符或者数字字符

    功能:

    判断是否是字母字符或者数字字符(a-z、A-Z、0-9)

    返回值:

    若返回值为非0数字,则为字母字符或数字字符,若返回0,则不是字母字符或数字字符。


    9、ispunct()——判断是否是标点符号字符

    功能:

    判断是否是标点符号字符(任何不属于数字或字母的图形字符)

    返回值:

    若返回值为非0数字,则为标点符号,若返回0,则不是标点符号。


    10、isgraph()——判断是否是图形字符

    功能:

    判断是否是图形字符(任何图形字符)

    返回值:

    若返回值为非0数字,则为图形字符,若返回0,则不是图形字符。


    11、isprint()——判断是否是可打印字符

    功能:

    判断是否是可打印字符(包括图形字符和空白字符)

    返回值:

    若返回值为非0数字,则为可打印字符,若返回0,则不是可打印字符。

     七.字符转换函数

    1.tolower(int c) ——字符转小写

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. printf("%c\n",tolower('H'));
    7. return 0;

     

    2.toupper(int c) ——字符转大写

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. printf("%c\n",toupper('h'));
    7. return 0;

  • 相关阅读:
    IP地址会暴露我们的隐私吗?
    加密数字货币:机遇与风险并存
    css美化滚动条
    金蝶云星空和聚水潭单据接口对接
    js promise从入门到精通
    什么是FOF,什么是信托
    Linux常用命令——chroot命令
    亲和性调度
    SpringMVC(一、快速入门)
    nginx的优化和防盗链
  • 原文地址:https://blog.csdn.net/2301_79580018/article/details/133840339