C语言|C语言—字符/字符串函数—strlen、strcpy、strcat、strcmp、strstr、strtok

目录
1、前言:
2、函数介绍
2.1 strlen
2.2 strcpy
2.3 strcat
2.4 strcmp
2.5 strncpy、strncmp、strncat
2.6 strstr
2.7 strtok
2.8 strerror
3、结语


1、前言: 在c语言中,我们经常会对“字符串”进行操作,当然我们可以用for循环的方式来一个字符一个字符的来处理,或者用以下介绍的字符/字符串函数,操作起来非常的方便。
2、函数介绍 2.1 strlen

size_t strlen(const char * str);

  • strlen功能:字符串已'\0' 作为结束标志,strlen函数返回的是在字符串中'\0' 前面出现的字符个数(不包含'\0' )。
注意:
  1. 参数指向的字符串必须要以'\0' 结束。
  2. strlen函数的返回值是size_t类型的,是无符号的,所以如果两个strlen相减的结果不会出现负数。
  • strlen的模拟实现(可以采用计数的方法、递归的方法、本次代码为指针-指针的方法)
//模拟strlen,用两个指针记录起始和终止位置void my_strlen(char* pa) { int count = 0; char* str = pa; while (*pa != '\0') { pa++; count++; } printf("%d", (pa - str)); }int main() { char arr[] = {"ajkljilbcde"}; my_strlen(arr); return 0; }

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

  • strcpy的功能:将源字符中的内容串拷贝到目标字符串中,destination中存入的是目标字符串的元素首地址,source是源字符串的元素首地址。
注意:
  1. 源字符串必须以'\0' 结束,如果源字符串没有‘\0’,内存会一直找,直到找到\0结束,这时候如果目标字符串的空间不够,就会发生越界。
  2. 会将源字符串中的'\0' 拷贝到目标空间。
  3. 目标空间必须足够大,以确保能存放源字符串。
  4. 目标空间必须可修改,不能是常量字符串。
  • strcpy的模拟实现(下面的代码,在while部分还可以简化代码,采用while(*des++ = *src++)
即可实现)
char* my_strcpy(char* des, char* src) { assert(des && src); char* ret = des; while (*src != '\0' ) { *des = *src; des++; src++; } *des = *src; return ret; }int main() { char arr1[20] = {0}; char arr2[] = { "abcdfd" }; my_strcpy(arr1, arr2); printf("%s",arr1); return 0; }

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

  • 将目标函数的字符串添加到源字符串的后面,从‘\0’这个位置来添加。
注意:
  1. 源字符串必须以'\0' 结束。
  2. 目标空间必须有足够的大,能容纳下源字符串的内容。
  3. 目标空间必须可修改。
  4. strcat不能自己给自己追加
  • strcat的模拟实现
char *my_strcat(char *dest, const char*src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); while(*dest) { dest++; } while((*dest++ = *src++)) { ; } return ret; }

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

  • strcmp的功能:比较两个字符串的大小,每次比较的是两个字符的ASCII码值,如果没有字符了,就和‘\0’进行比较,如果两个字符相同,那就向后比较,直到不同或遇到‘\0’
标准规定:
  1. 第一个字符串大于第二个字符串,则返回大于0的数字。
  2. 第一个字符串等于第二个字符串,则返回0。
  3. 第一个字符串小于第二个字符串,则返回小于0的数字。
2.5 strncpy、strncmp、strncat 以上函数,在上述介绍的函数上加上了n,也就是可以指定操作的字符个数,其余方法使用没有太大差别,在这里不过多赘述。
2.6 strstr
char* strstr(const char *str1, const char *str2);

  • strstr的功能是: 在一个字符串中找另一个字符串(在str1中找str2这个字符串),看str2是不是str1的子串,str2如果在str1中出现了,就会返回第一次出现的字符的地址。
  • 如果str2在str1中没有出现,那就返回空指针(NULL)。
  • 模拟实现strstr
char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); const char* s1 = str1; const char* s2 = str2; const char* cur = str1; while (*cur) { s1 = cur; s2 = str2; while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') { return (char*)cur; } cur++; } return NULL; //找不到 } int main() { char arr1[] = "abcdeqcdef"; char arr2[] = "cdef"; char* ret = my_strstr(arr1, arr2); if (NULL == ret) { printf("找不到子串\n"); } else { printf("%s\n", ret); } return 0; }

注意:
  1. str1(s1),str2(s2),默认指向两个字符串的首字符的地址;
  2. while循环的条件是:s1、s2没有到'\0',s1和s2指向的字符一样。s1指向的是要搜索的字符串("abcdeqabcdef"),s2是遍历的cdef这个字符串。
2.7 strtok
char* strtok (char* str, const char* sep );

  • sep参数是个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。
  • strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL 指针。
  • strtok的用法:
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; }

2.8 strerror
char* strerror(int errnum);

  • strerror功能:返回错误码对应错误信息的字符串首地址。
3、结语 C语言封装的处理字符串的函数功能很强大,希望大家看了我的博客能有所帮助。
【C语言|C语言—字符/字符串函数—strlen、strcpy、strcat、strcmp、strstr、strtok】博主肝代码不容易,如果对你有帮助的话,麻烦点个赞呦!!!

    推荐阅读