0.前言:
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数
1.字符串函数:
1.1strlen
size_t strlen(const char *str)
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是无符号的
#include <stdio.h> #include <string.h> int main() { const char* str1 = "asdfg"; const char* str2 = "wu"; if (strlen(str1) > strlen(str2)) { printf("str1>str2\n"); } else { printf("str2>str1\n"); } return 0; }
1.1.2strlen模拟实现
//计数器 size_t my_strlen(const char* str) { int count = 0; while (*str) { if (*str != '\0') { count++; str++; } } return count; } //指针 size_t my_strlen(const char* str) { char* len = str; while (*len != '\0') { len++; } return len - str; } //递归 size_t my_strlen(const char* str) { if (*str == '\0') return 0; return 1 + my_strlen(str + 1); }
1.2strcpy
char* strcpy(char * destination, const char * source );
- 将源指向的C字符串复制到目标指向的数组中,包括终止的空字符(并在此时停止)
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变
1.2.1strcpy使用
int main() { char arr2[] = "hello world"; char arr1[20] = { 0 }; strcpy(arr1, arr2); printf("%s \n", arr1); return 0; }
1.2.2srecpy模拟实现
char* my_strcpy(char* dest, const char* str) { while (*str != '\0') { *dest = *str; dest++; str++; } *dest = *str; return dest; } int main() { char arr2[] = "bite"; char arr1[20] = { 0 }; my_strcpy(arr1, arr2); printf("%s \n", arr1); return 0; }
1.3strcat
char * strcat ( char * destination, const char * source );
- 将源字符串的副本附加到目标字符串中。目标中的终止空字符将被源的第一个字符覆盖,并且在目标中两者的连接形成的新字符串的末尾包含一个空字符。
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
1.3.1strcat使用
int main() { char arr1[30] = "hello "; char arr2[] = "bite"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
1.3.2strcat模拟实现
char* my_strcat(char* dest, const char* str) { assert(dest && str); char* ret = dest; while (*dest) { dest++; } while (*dest++ = *str++) { ; } return ret; } int main() { char arr1[30] = "hello "; char arr2[] = "world"; my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
1.4strcmp
int strcmp ( const char * str1, const char * str2 );
- 这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下的对,直到字符不同或达到终止的空字符。
- 标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
1.4.1strcmp使用
int main() { char* str1 = "asd"; char* str2 = "asd"; if (strcmp(str1, str2) == 0) printf("两字符串相等\n"); else printf("不相等\n"); return 0; }
1.4.2strcmp模拟实现
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1++ == *str2++) { if(*str1 == '\0') break; } if (str1 > str2) return 1; else if (str1 < str2) return -1; else return 0; } int main() { char* str1 = "asd"; char* str2 = "asdf"; int ret = my_strcmp(str1, str2); printf("%d \n", ret); return 0; }
1.5strncpy
char * strncpy ( char * destination, const char * source, size_t num );
将源文件的第一个数个字符复制到目标文件。如果在复制num字符之前找到源C字符串的结尾(由空字符表示的信号),则将用零填充目标,直到写入了全部num字符为止。
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
1.5.1strncpy使用
int main() { char str1[20] = "xxxxx"; char* str2 = "yyy"; strncpy(str1, str2, 5); printf("%s \n", str1); return 0; }
1.6strncat
char * strncat ( char * destination, const char * source, size_t num );
- 将源代码的第一个num字符附加到目标代码中,再加上一个终止的空字符。
- 如果源中C字符串的长度小于num,则只复制直到终止空字符的内容
1.6.1strncat使用
int main() { char arr1[20] = "hi "; char arr2[] = "jeka"; strncat(arr1, arr2, 10); printf("%s\n", arr1); return 0; }