字符串处理函数分类
- 求字符串长度: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);
else
return 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;
}
输出结果:
其他两个相似