字符串处理函数分类
- 求字符串长度:strlen
- 长度不受限制的字符串函数:strcpy,strcat,strcmp
- 长度受限制的字符串函数:strncpy,strncat,strncmp
- 字符串查找:strstr,strtok
- 错误信息报告:strerror
- 字符操作,内存操作函数:memcpy,memmove,memset,memcmp
strlen
这是一个用于计算字符串长度的函数,它从字符串的起始位置开始计数,直到遇到字符串结束符\0
为止,然后返回计数器的值。这个函数不包括结束符\0
在内
strlen函数的特点
- 字符串以‘\0’作为结束标志,strlen函数返回的是字符串中‘\0’前面出现的字符个数
strlen函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include <assert.h>
#include<string.h>int my_strlen1(const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}//递归
int my_strlen2(const char* str)
{assert(str != NULL);if (*str != '\0')return 1 + my_strlen2(str + 1);elsereturn 0;
}//指针-指针
int my_strlen3(const char* str)
{const char* start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "abcdef";int ret1 = my_strlen1(arr);int ret2 = my_strlen2(arr);int ret3 = my_strlen3(arr);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}
strlen函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr[] = "bdeuwbfuycgbei";int ret = strlen(arr);printf("%d", ret);return 0;
}
输出结果:
strcpy
这个函数用于将一个字符串复制到另一个字符串中,直到遇到源字符串的结束符\0为止。如果目标字符串已经有内容,会被源字符串覆盖
strcpy函数的特点
- 源字符串必须以 '\0' 结束
- 会将源字符串中的 '\0' 拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
strcpy函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcpy(char* din, char* sou)
{char* ret = din;assert(din && sou);while ( *din++=*sou++ ){;}return ret;
}int main()
{char str1[20] = "hello ";char str2[] = "hehe";my_strcpy(str2, str1);printf("%s\n", str2);return 0;
}
输出结果:
strcpy函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "hello";char arr2[] = "xixi";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}
strcat
这个函数用于将一个字符串追加到另一个字符串的末尾,形成一个新的字符串。它会将源字符串的内容添加到目标字符串的后面,直到遇到源字符串的结束符\0为止
strcat函数的特点
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改
strcat函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcat(char* din, char* sou)
{assert(din && sou);char* ret = din;while (*din){din++;}while (*din++ = *sou++){;}return ret;
}int main()
{char arr1[] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
strcat函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main ()
{char key[] = "apple";char buffer[80];do {printf ("Guess my favorite fruit? ");fflush (stdout);scanf ("%79s",buffer);} while (strcmp (key,buffer) != 0);puts ("Correct answer!");return 0;
}#include<stdio.h>
#include<string.h>int main()
{char str[80];strcpy(str, "these ");strcat(str, "strings ");strcat(str, "are ");strcat(str, "concatenated.");puts(str);return 0;
}
输出结果:
strcmp
这个函数用于比较两个字符串。如果两个字符串相等,它返回0;如果第一个字符串小于第二个字符串,它返回负数;如果第一个字符串大于第二个字符串,它返回正数
strcmp函数的规定
strcmp函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>int my_strcmp(const char* arr1, const char* arr2)
{assert(arr1 && arr2);while (*arr1 == *arr2){if (*arr1 == '\0')return 0;*arr1++;*arr2++;}return *arr1 - *arr2;
}int main()
{char arr1[] = "abc";char arr2[] = "abcde";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}
strcmp函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main()
{char key[] = "apple";char buffer[80];do {printf("Guess my favorite fruit? ");fflush(stdout);scanf("%79s", buffer);} while (strcmp(key, buffer) != 0);puts("Correct answer!");return 0;
}
输出结果:
strcpy,strcat,strcmp与strncpy,strncat,strncmp的区别
长度限制方面
strcpy
、strcat
、strcmp
:属于长度不受限制的字符串函数,以'\0'
作为操作结束标志。例如strcpy
会将源字符串一直拷贝到'\0'
才停止,strcat
会将源字符串追加到目标字符串后直到源字符串的'\0'
,strcmp
会比较两个字符串直到遇到'\0'
。不过这也可能带来问题,如strcpy
在目的空间不够时,由于拷贝到'\0'
才停止,可能会导致越界访问,使函数变得不安全 。strncpy
、strncat
、strncmp
:属于长度受限制的字符串函数,在函数调用时需要额外指定操作的字符数量,能避免因操作过长字符串而引发的安全问题
#define _CRT_SECURE_NO_WARNINGS 1
/* strncpy example */
#include <stdio.h>
#include <string.h>int main()
{char str1[] = "To be or not to be";char str2[40];char str3[40];/* copy to sized buffer (overflow safe): */strncpy(str2, str1, sizeof(str2));/* partial copy (only 5 chars): */strncpy(str3, str2, 5);str3[5] = '\0'; /* null character manually added */puts(str1);puts(str2);puts(str3);return 0;
}
输出结果:
其他两个相似