3. strcat函数
功能: 连接字符串
char * strcat ( char * destination, const char * source ); //destineion--指向目标数组的指针,该数组应包含字符串,并且足够大以包含串联的结果字符串 //source--要追加的字符串
将源字符串的副本追加到目标字符串。
目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。
目的地和来源不得重叠。
🍤 实例:
#include <stdio.h> #include <string.h> int main() { char str1[100]="hello "; char str2[] = "world"; printf("%s\n", strcat(str1, str2)); return 0; }
🍤 运行结果:
注:
🍥 源字符串必须以 ‘\0’ 结束。
🍥 目标空间必须有足够的大,能容纳下源字符串的内容。
🍥 目标空间必须可修改。
3.1 模拟实现
#include<stdio.h> char* my_strcat(char*dest, const char *src) { assert(dest && src); char* ret = dest; //1. 找目标空间中的\0 while (*dest) { dest++; } while (*dest++ = *src++)//实现拷贝 { ; } return ret; } int main() { char arr1[20] = "hello "; char arr2[] = "world"; my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
4. strcmp函数
功能: 比较两个字符串
int strcmp ( const char * str1, const char * str2 );
将字符串 str1 与字符串 str2 进行比较。
开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止空字符。
此函数执行字符的二进制比较。
标准规定:
🍥 第一个字符串大于第二个字符串,则返回大于0的数字
🍥 第一个字符串等于第二个字符串,则返回0
🍥 第一个字符串小于第二个字符串,则返回小于0的数字
🍤 实例1:
#include<stdio.h> #include<string.h> int main() { printf("%d\n", strcmp("bbq","bcq")); return 0; }
🍤 运行结果:
-1
🍤 实例2:猜动物
#include<stdio.h> #include<string.h> int main() { char str1[] = "dog"; char str2[80]; do { printf("Guess my favorite animal? "); scanf("%s", str2); } while (strcmp(str1, str2) != 0); puts("Correct answer!"); return 0; }
🍤 运行结果:
4.1 模拟实现
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++;//后移 str2++; } return (*str1 - *str2); } int main() { int ret = my_strcmp("bbq", "bcq"); if (ret>0) printf(">\n"); printf("%d\n", ret);//-1 return 0; }
5. strncpy函数
功能: 从字符串中复制字符
char * strncpy ( char * destination, const char * source, size_t num ); //destination--指向要在其中复制内容的目标数组的指针。 //source--要复制的 C 字符串。 //num--要从源复制的最大字符数。 //size_t 是无符号整数类型。
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于 num,则拷贝完源字符串之后,在目标的后边追加0,直到 num个。
🍤 实例:
#include <stdio.h> #include <string.h> int main() { char str1[] = "To be or not to be"; char str2[40]; char str3[40]; strncpy(str2, str1, sizeof(str2)); strncpy(str3, str2, 5); str3[5] = '\0'; puts(str1);//打印字符串 puts(str2); puts(str3); return 0; }
🍤 运行结果:
5.1 模拟实现
#include<stdio.h> #include<assert.h> char* my_strncpy(char* dest, const char* sou, size_t num) { char* ret = dest; assert(dest != NULL); assert(sou != NULL); for (int i = (int)num; i > 0; i--) *dest++ = *sou++; return ret; } int main() { char str1[20] = "abcdef"; char str2[] = "xxx"; my_strncpy(str1, str2, sizeof(str1)); puts(str1); return 0; }
🍤 运行结果:
xxx
6. strncat函数
功能: 从字符串追加字符
char * strncat ( char * destination, const char * source, size_t num ); //destination--指向目标数组的指针,该数组应包含一个字符串,并且足够大以包含串联的结果字符串,包括其他 null 字符。 //source--要追加的 C 字符串。 //num--要追加的最大字符数。 //size_t是无符号整数类型。
将源的第一个数字字符追加到目标,外加一个终止空字符。
如果源中 C 字符串的长度小于 num,则仅复制终止空字符之前的内容。
🍤 实例1:
#include <stdio.h> #include <string.h> int main () { char str1[20]; char str2[20]; strcpy (str1,"To be "); strcpy (str2,"or not to be"); strncat (str1, str2, 6);//将str2的前6个字符追加给str1后面 puts (str1);//To be or not return 0; }
🍤 运行结果:
🍤 实例2:
int main() { char arr1[20] = "abcdef\0yyyyyyyy"; char arr2[] = "xxxxxxxxx"; strncat(arr1, arr2, 3); puts(arr1);//abcdefxxx return 0; }
🍩说明了,遇到了结束标志 '\0' 就开始复制源代码
6.1 模拟实现
#include <stdio.h> #include<assert.h> char* my_strncat(char* dest, const char* soc, size_t num) { char* ret = dest; int i=0; int count = 0; assert(dest != NULL); assert(soc != NULL); while (*dest != '\0') { dest++; } while (num--)//终止条件:复制的个数num *dest++ = *soc++;//追加 *dest = '\0'; return ret; } int main() { char arr1[20] = "abcdef\0yyyyyyyy"; char arr2[] = "xxxxxxxxx"; my_strncat(arr1, arr2, 3); puts(arr1);//abcdefxxx return 0; }
🍤 运行结果: