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



