欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 【C语言】字符串函数详细讲解

【C语言】字符串函数详细讲解

2025/2/23 17:03:27 来源:https://blog.csdn.net/mfy12138/article/details/141940259  浏览:    关键词:【C语言】字符串函数详细讲解

文章目录

  • 前言
  • 求字符串长度(strlen)
    • strlen的声明和使用
    • strlen模拟实现
  • 字符串拷贝(strcpy)
    • strcpy的声明和使用
    • strcpy模拟实现
  • 字符串追加函数(strcat)
    • strcat的声明和使用
    • strcat模拟实现
  • 字符串比较函数(strcmp)
    • strcmp的声明和使用
    • strcmp模拟实现
  • strncpy
    • strncpy的声明和使用
  • strncat
    • strncat的声明和使用
  • strncmp
    • strncmp的声明和使用
  • 字符串查找函数(strstr)
    • strstr的声明和使用
    • strstr模拟实现
  • 字符串分隔函数(strtok)
    • strtok的声明和使用
  • 最后

前言

本片来深入讲解C语言中经常使用的字符串函数,使用字符串函数时都要包含头文件<string.h>。

求字符串长度(strlen)

strlen的声明和使用

size_t  strlen  ( const char * str )

在这里插入图片描述

使用strlen注意点:

  • 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 )
    请看下面代码,输出的结果是什么?
int main()
{char arr1[] = { "abc" };char arr2[] = { "abcde"};if (strlen(arr1) - strlen(arr2)>0){printf("arr1>arr2\n");//执行}elseprintf("arr1<=arr2\n");return 0;
}

本题看似简单其实不认真就会出错,认为会输出arr1<=arr2,但答案是arr1>arr2。
因为strlen返回值为size_t无符号整形,两个无符号整形相减得到的结果是无符号整形,arr1的长度为3减去arr2的长度5结果为-2,但-2为无符号整数,计算机会把它认为是一个很大的正数,所以输出前者。
所以在使用strlen时要注意strlen的返回值为无符号整形。

strlen模拟实现

主函数

int main()
{char arr[] = { "abcdef" };// 计算int ret = my_strlen(arr);//输出printf("%d ", ret);return 0;
}

my_strlen实现代码
迭代实现

size_t my_strlen(const char* str)
{assert(str);int count = 0;while (*str){count++;str++;}return count;
}
  • str字符串只是计算大小,而不用修改值,所以用const修饰char *指针,只能访问内容,而不能修改。
  • assert断言,用于判断指针不为空。
    希望读者们写代码时也能这样写,增强代码的健壮性,对后续检查代码有帮助。
    递归实现
size_t my_strlen(const char* str)
{assert(str);if (*str)return 1 + my_strlen(str + 1);elsereturn 0;
}

指针 - 指针实现

size_t my_strlen(const char* str)
{assert(str);const char* p = str;while (*p){p++;}return p - str;
}

字符串拷贝(strcpy)

strcpy的声明和使用

char* strcpy(char * destination, const char * source);

在这里插入图片描述
使用strcpy注意点:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间内容必须可变。

strcpy模拟实现

char* my_strcpy(char* destination, const char* source){char* ret = destination;while (*destination = *source){destination++;source++;}return ret;}

字符串追加函数(strcat)

strcat的声明和使用

char * strcat ( char * destination, const char * source );

在这里插入图片描述

  • 源字符串必须以 ‘\0’ 结尾。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

注意:
字符串自己给自己追加会有问题.
在这里插入图片描述
<font size= face=‘正楷’ color=green>source的内容会覆盖掉destination的内容,导致字符串没有结束标志,会死循环下去,所以最好不要字符串自己追加。

strcat模拟实现

//strcat模拟实现
char* my_strcat(char* des, const char* sour)
{char* ret = des;//参数不能为空assert(des && sour);//找到des的\0while (*des++);des--;//循环赋值while (*des++ =*sour++);return ret;
}
int main()
{char arr1[] = { " bit"};char arr[20] = {"hello"};char *ret=my_strcat(arr, arr1);printf("%s\n", ret);return 0;
}

字符串比较函数(strcmp)

strcmp的声明和使用

int strcmp ( const char * str1, const char * str2 );

在这里插入图片描述
规定

  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。

怎么判断两个字符串的大小呢?
按顺序比较两个字符串的内容,如果相等就比较下一个字符,如果两个字符不相等就比较两个字符的ACLL码值,按标准返回值。

strcmp模拟实现

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2 && *str1!='\0'){str1++;str2++;}if (*str1 > *str2){return 1;}if (*str1 < *str2){return -1;}return 0;
}
int main()
{char arr1[] = { "abc" };char arr2[] = { "abc" };int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

前面学习的字符串函数都是没有限制长度的,在使用时不注意就会有越界的风险,所以下面学习一下相对比较安全的函数,增加了限制长度的字符串函数。

strncpy

strncpy的声明和使用

char * strncpy ( char * destination, const char * source, size_t num );

在这里插入图片描述

  • 拷贝num个字符从源字符串到目标空间。
  • 当源字符串的长度大于num的大小时,num是多少拷贝多少,当源字符串的长度小于num的大小时,拷贝完源字符串后,在后面添加 ’ \0 '直到拷贝数量等于num时停止。
    在这里插入图片描述

strncat

strncat的声明和使用

char * strncat ( char * destination, const char * source, size_t num );

在这里插入图片描述

  • 在目标字符串后追加num个字符,最后增加 ’ \0 '。
  • 当源字符串长度小于num的大小时,则仅复制终止 null 字符之前的内容。
#include <stdio.h>
#include <string.h>
int main ()
{char str1[20];char str2[20];strcpy (str1,"To be ");strcpy (str2,"or not to be");strncat (str1, str2, 6);puts (str1);return 0;
}

strncmp

strncmp的声明和使用

int strncmp ( const char * str1, const char * str2, size_t num );

在这里插入图片描述

  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
    在这里插入图片描述
#include <stdio.h>
#include <string.h>
int main ()
{char str[][5] = { "R2D2" , "C3PO" , "R2A6" };int n;puts ("Looking for R2 astromech droids...");for (n=0 ; n<3 ; n++)if (strncmp (str[n],"R2xx",2) == 0){printf ("found %s\n",str[n]);}return 0;
}

字符串查找函数(strstr)

strstr的声明和使用

const char * strstr ( const char * str1, const char * str2 );

在这里插入图片描述

  • 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
  • 匹配过程不包括终止 null 字符,但会在此处停止。
int main()
{char str[] = "This is a simple string"; char* pch;pch = strstr(str, "simple");strncpy(pch, "sample", 6);puts(str);return 0;
}

strstr模拟实现

//strstr模拟实现
const char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);//向后查找字符串str1const char* p1 = str1;//向后查找字符串str2const char* p2 = str2;//标记str1查找的位置const char* cp = str1;while (*cp){p1 = cp;while (*p1 == *p2 && *p2){p1++;p2++;}if (*p2 == '\0'){return cp;}p2 = str2;cp++;}return cp;
}
int main()
{char str[] = "abbbbcde";char* pch;pch = my_strstr(str, "bbc");puts(pch);return 0;
}

字符串分隔函数(strtok)

strtok的声明和使用

char * strtok ( char * str, const char * delimiters );
  • sep参数是个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。
int main ()
{char str[] ="- This, a sample string.";char * pch;printf ("Splitting string \"%s\" into tokens:\n",str);pch = strtok (str," ,.-");while (pch != NULL){printf ("%s\n",pch);pch = strtok (NULL, " ,.-");}return 0;
}

最后

感谢大家的观看, 大家可以在评论区留言,你们的支持就是我最大的动力。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词