字符串函数
- strlen()
- 介绍
- 作用
- 举例使用strlen()函数
- 模拟实现strlen()函数
- strcpy()
- 介绍
- 作用
- 举例使用strcpy()函数
- 模拟实现strcpy()函数
- strcpy()函数注意事项
- strncpy()函数
- 介绍
- 举例使用strncpy()函数
- strcat()
- 介绍
- 作用
- 举例使用strcat()函数
- 模拟实现strcat()函数
- strcat()函数注意事项
- strncat()函数
- 介绍
- 举例使用strncat()函数
- strcmp()
- 介绍
- 作用
- 举例使用strcmp()函数
- strncmp()函数
- strstr()
- 介绍
- 作用
- 举例使用strstr()函数
- 模拟实现strstr()函数
- strtok()
- 介绍
- 作用
- 举例使用strtok()函数
- 以下介绍的字符串函数都是在<string.h>的头文件下的
strlen()
介绍
- 函数模型:size_t strlen( const char * string );
- 参数:一个字符串
- 返回值是size_t(unsigned int),无符号整数,因为字符串长度不可能是负数,因此返回值是一个无符号整数
作用
- 求字符串的长度,并且在计数过程中遇到’\0’,就会停止计数,返回’\0’之前的字符个数
举例使用strlen()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "abcdefg";
printf("%u", strlen(str));
//因为strlen()函数返回的是无符号整数,因此最正确的写法是打印%u,%u是打印无符号整数,当然如果这里写成%d也可以
return 0;
}
模拟实现strlen()函数
#include <stdio.h>
int my_strlen(const char* s)
{
char* p = s;
if (*p == '\0')//当遇到'\0'时,就停止计数
return 0;
return 1 + my_strlen(p + 1);
}
int main()
{
char str[] = "abcdefg";
int len = my_strlen(str);
printf("%d\n", len);
return 0;
}
strcpy()
介绍
- 函数模型:char * strcpy( char * str1, const char * str2 );
- 参数:目标字符串和被拷贝字符串
作用
- 字符串拷贝,将字符串str2的内容拷贝到字符串str1中
举例使用strcpy()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20];
char str2[] = "abcdef";
strcpy(str1, str2);//将字符串str2的内容拷贝到字符串str1中
printf("%s", str1);
return 0;
}
模拟实现strcpy()函数
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* str)
{
char* ret = dest;
assert(dest != NULL);
assert(str != NULL);
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "###############";
char arr2[] = "bits";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
strcpy()函数注意事项
- strcpy()函数在使用时,目标字符串的空间必须足够大(比被拷贝的字符串空间大,因为strcpy是当遇到’\0’是才会停止拷贝),这样才能正常使用,如果空间太小,就无法使用,因此在有些编译器(比如VS)中会认为该函数不安全
- 但是在C语言的库中,还有另一个字符串拷贝函数----strncpy(),相比于strcpy()函数更安全
strncpy()函数
介绍
- 函数模型:char * strncpy( char * str1, const char * str2, size_t count );
- 相比于strcpy()函数,strncpy()函数多了一个参数,该参数是用来限定拷贝的长度的
举例使用strncpy()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "################";
char str2[] = "abcdef";
strncpy(str1, str2, 2);
printf("%s", str1);
return 0;
}
- 运行结果
strcat()
介绍
- 函数模型:char * strcat( char * str1, const char * str2 );
作用
- 将字符串str2追加到字符串str1后面
举例使用strcat()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcd";
char str2[] = "efg";
strcat(str1, str2);
printf("%s", str1);
return 0;
}
- 运行结果
模拟实现strcat()函数
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest,const char* src)
{
assert(dest && src);
char* p = dest;
//找到'\0'
while (*++dest)
{
;
}
//开始追加
while (*dest++ = *src++)
{
;
}
return p;
}
int main()
{
char arr1[20] = "abcd";
char arr2[] = "efg";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcat()函数注意事项
- 与strcpy()函数一样,strcat()同样存在不安全的情况,当strcat()追加自己时,就无法完成
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcd";
char str2[] = "efg";
strcat(str1, str1);
printf("%s", str1);
return 0;
}
上诉代码无法完成对自己的追加
- 此时可以用strncat()函数
strncat()函数
介绍
- 函数模型:char * strncat( char * str1, const char * str2, size_t count );
- 相比于strcat()函数,多增加的参数是要追加的数量
举例使用strncat()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcd";
strncat(str1, str1, 4);
printf("%s", str1);
return 0;
}
strcmp()
介绍
- 函数模型:int strcmp( const char * string1, const char * string2 );
作用
- 比较字符串大小内容(不是长度)(参考字典序)(ASCII值),若string1>string2,返回一个大于0的数,若string1=string2,返回0,若string1 < string2,返回小于0的数。
举例使用strcmp()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcd";
char str2[] = "abce";
int ret = strcmp(str1, str2);
printf("%d", ret);
return 0;
}
strncmp()函数
- 同上面函数一样,比strcmp()函数多了一个参数,比较的个数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcd";
char str2[] = "abce";
int ret = strncmp(str1, str2, 3);
printf("%d", ret);
return 0;
}
strstr()
介绍
- 函数模型:char * strstr( const char * string, const char * strCharSet );
作用
- 字符串查找函数,如果字符串strCharSet在字符串string中,返回第一次出现的位置的指针,若不在string中,则返回空指针
举例使用strstr()函数
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "dhafjkhsdabcdrewtertwert";
char str2[] = "abc";
char* ret = strstr(str1, str2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到\n");
return 0;
}
- 运行结果
模拟实现strstr()函数
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
char* p1;
char* p2;
char* cp = str1;//记录可能成功的值
while (*cp != '\0')
{
p1 = cp;
p2 = str2;
/*while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)*/
while (*p1 && *p2 && *p1 == *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
return cp;
if (*p1 == '\0')
return NULL;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "I am a good student, hehe";
char arr2[] = "student";
char* ret = my_strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
strtok()
介绍
- 函数模型:char * strtok( char * str, const char * strDelimit );
- strDelimit是分隔符字符集
作用
- strtok()是用来切割字符串的
- 第一个参数指定一个字符串,它包含了0个或多个由strDelimit字符串中一个或多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操控的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)。
- strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
举例使用strtok()函数
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "15145j@qq.com";
char arr2[100] = { 0 };
strcpy(arr2, arr1);
char sep[] = "@.";
char* ret = NULL;
for (ret = strtok(arr2, sep);ret != NULL; ret = strtok(NULL, sep))
{
printf("%s\n", ret);
}
/*strtok(arr2, sep);
strtok(NULL, sep);*/
return 0;
}
- 运行结果