目录
1. strcpy()函数
1.1 strcpy()的函数声明
点击转到cpluscplus.com官网 - strcpy
所需头文件string.h
strcpy()
是字符串复制函数,把源头字符串的内容拷贝到目标字符串中,包括源字符串中的'\0'
。- 源字符串必须以字符
'\0'
结束- 目标空间必须足够大,确保能存放源字符串,否则越界访问程序出错。
- 目标空间必须可变。
1.2 模拟实现strcpy()函数
//模拟实现strcpy
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* destination, const char* source) {
//断言,两个指针有一个是空指针程序就报错
assert(destination && source);
/*在源字符串的内容复制到目标字符串时,指向目标字符串和指向源字符串的指针均会发生移动,但该函数返回一个字符指针,是目标字符串的地址,所以需要记录目标字符串的地址。*/
char* start = destination;
//指向目标字符串和指向源字符串的指针先解引用,在赋值,之后自增。
while (*destination++ = *source++) {
;
}
//返回目标字符串的地址
return start;
}
int main() {
char* str1 = "Hello world!";
char str2[20] = { 0 };
puts(strcpy(str2, str1));
return 0;
}
运行结果:
2. strcat()函数
2.1 strcat的函数声明
点击跳转cpluscplus.com官网 - strcat
所需头文件string.h
- 把源字符串的内容(包括
'\0'
)追加到目标空间中。- 源字符串必须以字符
'\0'
结尾。- 目标空间必须有足够大的空间,用来容纳源字符串的内容。
- 目标空间必须可以修改,形参不能用const修饰。
- 注意到源字符串加了
const
修饰,不能再该函数内通过指针source
修改字符串的内容。减小了该函数的权限。- 返回类型是
char*
类型,返回的是目标空间的地址。- 当字符串自己给自己追加时程序会出错,字符串末尾的
'\0'
被字符串首元素覆盖了。
2.2 模拟实现strcat()函数
//模拟实现strcat
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* destination, const char* source) {
//断言
assert(destination && source);
//记录目标字符串首地址
char* start = destination;
//找到目标字符串的末尾'\0'
while (*destination) {
destination++;
}
//复制
while (*destination++ = *source++) {
;
}
return start;
}
int main() {
char* str1 = " world!";
char str2[20] = { "Hello"};
puts(strcat(str2, str1));
return 0;
}
运行结果:
3. strcmp()函数
3.1 strcmp()的函数声明
点击跳转cpluscplus.com官网 - strcmp
所需头文件string.h
- 比较两个字符串,开始时比较每个字符串的第一个字符,如果这两个字符相等,就继续处理下一对字符,直到下一对字符不同或达到终止的空字符
'\0'
。- 具体比较时,比较的是字符的
ASCII
码值,与字符串的长短没有关系。- 标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
3.2 模拟实现strcmp()函数
3.2.1 初始版本
//模拟实现strcmp
#include <stdio.h>
#include <stdio.h>
#include <assert.h>
int my_strcmp1(const char* str1, const char* str2) {
//断言
assert(str1 && str2);
//循环判断
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main() {
char str1[] = "abcdef";
char str2[] = "abcdef";
int ret = my_strcmp1(str1, str2);
if(ret > 0) {
printf("str1 > str2\n");
}
else if (ret == 0) {
printf("str1 == str2\n");
}
else {
printf("str1 < str2\n");
}
return 0;
}
运行结果:
结语
strcpy()
函数、strcat()
函数、strcmp()
函数都是长度不受限制的字符串函数,存在一定的隐患。可能有越界访问的情况出现。
END