1. 求字符串长度
strlen
2. 长度不受限制的字符串函数
strcpy
strcat
strcmp
3. 长度受限制的字符串函数介绍
strncpy
strncat
strncmp
4. 字符串查找
**strstr
**
**
1. 函数介绍
**1.1 strlen**
size_t strlen ( const char * str );
注意事项:
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束
注意函数的返回值为size_t,是无符号的,如下图所示:
int main() { if (strlen("abcd") - strlen("abcdefg")>0) //注意函数的返回值为size_t,是无符号的( 易错 )3-6=-3 ,返回的是3 printf(">\n"); else printf("<\n"); return 0; }
模拟实现如下:
size_t my_strlen(const char* str) { assert(str); const char* start = str; const char* end = str; while (*end != '\0') { end++; } return end - start; } int main() { char arr[] = "abcdefg"; int len = my_strlen(arr); printf("%d ", len); return 0; }
1.2 strcpy
**
char * strcpy ( char * destination, const char * source );
注意事项:
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变
举例如以下代码:
int main() { char arr[10] = "abcdefg"; //const char* p = "zxy"; // char arr2[] = "zxyzx"; char arr3[] = { 'a','\0' ,'b','c'}; //输出a strcpy(arr, arr3); printf("%s\n", arr); return 0; }
模拟实现如下:
char* my_strcpy(char* arr1, const char* arr2) { assert(arr1); assert(arr2); char* ret = arr1; while (*arr1++ = *arr2++) { ; } return ret; } int main() { char arr1[20] = "abcdef"; char arr2[] = "hello world"; //char* arr2 = "hello world"; // my_strcpy(arr1, arr2); my_strcpy(arr2, arr1); printf("%s\n", arr2); return 0; }
1.3 strcat
char * strcat ( char * destination, const char * source );
注意事项:
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
不能实现自己给自己追加(重要!)
举例如下:
int main() { char arr1[20] = "abcde \0fg"; char arr2[] = "zxzx"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
模拟实现如下:
char* my_strcat(char* arr1, const char* arr2) { //1.找到目标空间的\0 char* ret = arr1; while (*ret != '\0') { ret++; } //2.拷贝到源头数据的\0之后 while (*ret++ = *arr2++) { ; } return ret; } int main() { char arr1[20] = "abcde \0fg"; char arr2[] = "zxzx"; my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
1.4 strcmp 比较的是对应位置上字符的大小,而非长度
int strcmp ( const char * str1, const char * str2 );
标准如下:
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
模拟如下:
int my_strcmp(const char* arr1, const char* arr2) { assert(arr1 && arr2); while (*arr1 == *arr2) { if (*arr1 == '\0') { return 0; } arr1++; arr2++; } /* if (*arr1 < *arr2) return -1; else return 1;*/ return *arr1 - *arr2; } int main() { char arr1[] = "abced"; char arr2[] = "bcaaf"; //char arr1[] = "abc"; //char arr2[] = "abc"; /* char arr1[] = "abc"; char arr2[] = "aba";*/ int ret= my_strcmp(arr1, arr2); if (ret < 0) printf("arr1<arr2\n"); else if (ret > 0) printf("arr1>arr2\n"); else printf("arr1==arr2\n"); printf("%d\n", ret); }
1.5 strncpy
char * strncpy ( char * destination, const char * source, size_t num );
注意事项:
1.拷贝num个字符从源字符串到目标空间;
2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
实现如下:
strncpy char* strncpy(char* destination, const char* source, size_t num); int main() { char arr1[20] = "abcdef"; char arr2[] = "xxxx"; strncpy(arr1, arr2,4); printf("%s\n", arr1); return 0; }
1.6 strncat
char * strncat ( char * destination, const char * source, size_t num );
注意事项:
从字符串追加字符将源的第一个数字字符追加到目标,外加一个终止空字符。
如果源中 C 字符串的长度小于num,则仅复制终止空字符之前的内容。
实现如下:
int main() { char arr1[20] = "ab\0cd"; char arr2[] = "xxxx"; strncat(arr1, arr2, 5); printf("%s\n", arr1); return 0; } 自己给自己追加 int main() { char arr1[20] = "abcd"; strncat(arr1, arr1, 5); printf("%s\n", arr1); return 0; }
1.7 strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
注意:
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完
实现如下:
int main() { char arr1[20] = "abc"; char arr2[] = "abce"; int ret= strncmp(arr1, arr2, 4); printf("%d\n", ret); return 0; }
1.8 strstr
const char * strstr ( const char * str1, const char * str2 );
char * strstr (char * str1, const char * str2 );
注意事项:
查找子字符串
1.返回指向str1 中第一次出现的 str2 的指针,如果str2 不是str1 的一部分,则返回一个空指针。
2.匹配过程不包括终止空字符,但它到此为止
实现如下;
char* my_strstr(const char* str1, const char* str2) { const char* s1 = str1; const char* s2 = str2; if (*str2== '\0') { return str1; } const char* p = str1; while (*p) { s1 = p; s2 = str2; if (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') { return (char*)p; } p++; } return NULL; } int main() { char arr1[] = "abcdef"; char arr2[] = "abc"; char* p = my_strstr(arr1, arr2); if (p == NULL) { printf("不存在\n"); } else { printf("%s\n", p); } return 0; }