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;
}
- 结果:
