strlen:
用途:Get the length of a string.获取字符串长度。
函数原型:size_t strlen( const char *
string
); size_t表示无符号的意思,长度值肯定是无符号的。
- 源字符串以'\0'作为结束标志。
- strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0')
- 返回值是无符号的,不能作减法。
模拟实现:
int my_strlen(const char *str) { int count = 0; assert(str != NULL); while (*str != '\0')//源串以'\0'位结束标志,不是'\0'就一直进入循环 { count++; str++; } return count; } int main() { int ret = 0; char arr[] = "abcdef"; ret = my_strlen(arr); printf("%d\n", ret); system("pause"); return 0; }
strcpy :
用途:Copy a string.字符串拷贝
函数原型:char *strcpy( char *
strDestination
, const char *
strSource
);
- 会将'\0'拷贝到目标空间,目标空间必须足够大,可以存放源字符串
- 目标空间必须足够大,可以存放源串
模拟实现:
char* my_strcpy(char *dest, const char *src) { assert(dest != NULL); assert(src != NULL); char *ret = dest; while (*dest++ = *src++) { ; } return ret; } int main() { char arr[] = " "; char *ret = my_strcpy(arr, "hello world"); printf("%s\n", ret); system("pause"); return 0; }
strncpy:
长度受限制的字符串拷贝。
函数原型:
char *strncpy( char *
strDest
, const char *
strSource
, size_t
count
);
- 拷贝count个字符从源串到目标空间
- 如果源串的长度小于count,则拷贝完源串后再目标的后边追加0,直到count个
模拟实现:
char *my_strncpy(char *arr, char *str, int count) { assert(str); char *ret = arr; while (count--) { (*arr++) = (*str++); } *arr = '\0'; return ret; } int main() { char arr[] = " "; printf("%s\n", my_strncpy(arr, "abcdef",4)); system("pause"); return 0; }
strcmp:
用途:Compare strings.
函数原型:
int strcmp( const char *
string1,
const char *
string2
);
- 如果string1大于string2,返回大于0的数字
- 如果string1等于string2,返回0
- 如果string1小于string2,返回小于0 的数字
模拟实现:
int my_strcmp(const char *str1, const char *str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++; str2++; } if (*str1 < *str2) return -1; else if (*str1 > *str2) return 1; /*return *str1 - *str2;*/ } int main() { char *str1 = "aaaaaaaa"; char *str2 = "aaasdffg"; int ret = my_strcmp(str1, str2); printf("%d\n", ret); system("pause"); return 0; }
strncmp:
长度受限制的字符串比较
函数原型:
int strncmp( const char *
string1
, const char *
string2
, size_t
count
);
- 比较到出现两个字符不一样或者一个字符串结束或者count个字符全部比较完。
int my_strncmp(const char *str1, const char *str2, int count) { assert(str1); assert(str2); while (count--) { if (*str1 == *str2) { str1++; str2++; } else { if (*str1 < *str2) return -1; else if (*str1 > *str2) return 1; } } return 0; } int main() { char *str1 = "aabcded"; char *str2 = "aadcdrfg"; printf("%d\n", my_strncmp(str1, str2, 4)); system("pause"); return 0; }
strcat:
用途:Append a string.字符串连接
函数原型:
char *strcat( char *
strDestination
, const char *
strSource
);
- 源字符串以'\0'结束
- 目标空间必须足够大,可以容纳源串的内容。
- 目标空间必须可修改
模拟实现:
char* my_strcat(char *dest, const char *src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); while (*dest != '\0') { dest++; } while (*dest++ = *src++) { ; } return ret; } int main() { char arr[] = "abc"; printf("%s\n", my_strcat(arr, "defgh")); system("pause"); return 0; }
strchr:
用途:Find a character in a string. 在字符串str中查找字符ch第一次出现的位置。
函数原型:
char *strchr( const char *
string
, int
c
);
模拟实现:
char* my_strchr(const char *str, int ch) { assert(str); while (*str && (*str != (char)ch)) str++; if (*str == (char)ch) return (char *)str; return NULL; } int main() { char *str = "abcdef"; printf("%s\n", my_strchr(str, 'a')); system("pause"); return 0; }
strrchr:
用途:Scan a string for the last occurrence of a character.在string中查找字符ch最后一个出现的位置
函数原型:
char *strrchr( const char *
string
, int
c
);
模拟实现:
char *my_strrchr(char *str, int ch) { assert(str); while (*str++) ; while (--str && (*str != (char)ch)) ; if (*str == (char)ch) return (char *)str; return NULL; } int main() { char *str = "abcdefasd"; printf("%s\n", my_strrchr(str, 'a')); system("pause"); return 0; }
strstr:
用途:Find a substring.
函数原型:
char *strstr( const char *
string
, const char *
strCharSet
);
模拟实现:
char* my_strstr(const char *str, const char * substr) { assert(str != NULL); assert(substr != NULL); while (*str != '\0') { const char *s1 = str; const char *s2 = substr; while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') { return (char*)str; } str++; } return NULL; } int main() { char *p = "abbbbcefd"; char *string = "bbc"; char *ret = my_strstr(p, string); if (ret == NULL) { printf("找不到\n"); } else { printf("%s\n", ret); } system("pause"); return 0; }
strncat:
用途:Append characters of a string.
函数原型:
char *strncat( char *
strDest
, const char *
strSource
, size_t
count
);
模拟实现:
char *my_strncat(char *arr, char *str, int count) { assert(arr&&str); char *ret = arr; while (*arr != '\0') arr++; while (count--) { *arr++ = *str++; } *arr = '\0'; return ret; } int main() { char arr[] = "ab"; printf("%s\n", my_strncat(arr, "cdefgh", 4)); system("pause"); return 0; }
接下来我们看一下string头文件中几个不太常见的函数:
strpbrk:
函数原型:
char *strpbrk( const char *
string
, const char *
strCharSet
);
- 返回第一个字符串中第一个出现在第二个字符串中的字符的地址。
- 测试一下:
int main() { char *p = "abcdef123hujkl"; char *p1 = "huhuhu1jij"; printf("%s\n", strpbrk(p, p1)); system("pause"); return 0; }
- 结果:
strspn:
函数原型:size_t strspn( const char *string, const char *strCharSet );
- 返回的是string字符串中开始部分匹配strCharSet字符串中字符的个数。
- 测试一下:
int main() { char *p = "huhuabcdef123hujkl"; char *p1 = "huhuhu1jij"; printf("%d\n", strspn(p, p1)); system("pause"); return 0; }
- 结果:
strcspn:
函数原型:size_t strcspn( const char *string, const char *strCharSet );
函数原型:size_t strcspn( const char *string, const char *strCharSet );
- 返回string中指向开始部分出现的不在strCharSet指向字符串中字符的个数。
- 测试一下:
int main() { char *p = "bcdef123hujkl"; char *p1 = "huhuhu1jij"; printf("%d\n", strcspn(p, p1)); system("pause"); return 0; }
- 结果: