- 一、字符串函数汇总
- 1. 求字符串长度 - strlen():
- 1.2 函数介绍:
- 1.3 自己模拟实现strlen()函数的功能
- 1.3.1 计数器版本
- 2. 字符串拷贝函数 - strcpy():
- 2.1 函数介绍:
- 2.2 自己模拟实现
- 3. 字符串追加函数 - strcat()
- 3.1 函数介绍:
- 3.2 自己模拟实现
- 4.查找字符串函数strstr():
- 4.1 函数介绍:
- 4.2模拟实现
- 5.strtok()函数:
- 5.1函数介绍:
- 6.strerror()函数:
- 6.1函数介绍
- 7. perror()函数:
- 二、总结
1.3 自己模拟实现strlen()函数的功能 1.3.1 计数器版本
- 字符串以 ‘ ’ 作为结束标志,strlen函数返回的是在字符串中 ‘ ’ 前面出现的字符个数(不包
含 ‘ ’ );- 传递的实参所指向的字符串必须要以 ‘ ’ 结束,否则得到的是一个错误值;
- 函数strlen()的返回值为size_t,是无符号的整数;
int my_strlen(const char*str){
int count = 0;
assert(str 1= NULL);
while(*str != ' ')
{
count ++;
str++;
}
return count;
}
结果:
2. 字符串拷贝函数 - strcpy(): 2.1 函数介绍:
2.2 自己模拟实现
- 所拷贝的字符串必须以 ‘ ’ 结束;
- 拷贝时会将源字符串中的 ‘ ’ 拷贝到目标字符串中;
- 必须保证存放拷贝的字符串的目标空间必须足够大,以确保能存放源字符串;
4.目标空间必须可变,这样才能往里面拷贝字符串;
char* my_strcpy(char*dest,char*str)
{
char* ret = dest;
assert(dest != NULL);
assert(str != NULL);
while(*dest++ = *str++)
{
;
}
return ret;
}
结果:
3. 字符串追加函数 - strcat() 3.1 函数介绍:
3.2 自己模拟实现源字符串必须以 ‘ ’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
char* my_strcat(char*dest,char*stc)
{
assert(dest && stc);
char* ret = dest;
//找目标字符串的
while(*dest)
{
dest++;
}
//追加字符串包括
while(*dest++ = *stc++)//先解引用,然后赋值,然后自增,然后判断;
{
;
}
return ret;
}
结果:
4.查找字符串函数strstr(): 4.1 函数介绍: 4.2模拟实现
思路图解:
char* my_strstr(const char* str1,const char* str2){
assert(str1 && str2);
const char* s1 =NULL;
const char* s2 =NULL;
const char* sta = str1;//保存原字符串的首地址
if(*str2 == ' ')
{
return (char*)str1;
}
while(*sta)
{
s1 = sta;
s2 = str2;
while(*s1 && *s2 && (*s1 == s2)
{
s1++;
s2++;
}
if(*s2 == ' ')
{
retuen (char*) sta;
}
sta++;
}
return NULL;
}
结果:
5.strtok()函数: 5.1函数介绍:
6.strerror()函数: 6.1函数介绍
- 功能:在字符串中查找指定标记:如在(add@acdd#sd$)中,查找标记:(@#¥),然后把标记隔开的字符打印;
- 第一个参数是字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分隔标记;
- strtok函数找到str中的标记符,并将它替换为’ ’,并且用一个指针保存这个地址,然后返回这个指针;strtok函数会改变被操作的字符串,所以在使用之前应该拷贝所要操作的字符串,然后传递拷贝的字符串给strtok函数,这样目标字符串就不会被改变;
- strtok函数第一个参数不为NULL时,函数讲找到str字符串中的第一个标记,strtok函数将保存它在字符串中的位置;
- strtok函数的第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标记;
- 如果字符串中不存在更多的标记,则返回NULL指针;
- 例子:
int main() { char arr[] = "zyth@guhdh.tech"; char* p ="@ ."; char tmp[20] ={0}; strcpy(tmp,arr); char* ret = NULL; ret = strtok(tmp,p); printf("%sn",ret); ret = strtok(NULL,p); printf("%sn",ret); ret = strtok(NULL,p); printf("%sn",ret); 进阶用法: for(ret = strtok(tmp,p);ret != NULL;ret = strtok(NULL,p)) { printf("%sn",ret); } }
- 结果:
7. perror()函数:函数功能:
- 返回错误码所对应的错误信息
- 必须包含头文件
//因为errno是一个全局变量,表示错误码;
- 例子:
int main() { printf("%sn",strerror(0)); printf("%sn",strerror(1)); printf("%sn",strerror(2)); printf("%sn",strerror(3)); printf("%sn",strerror(4)); printf("%sn",strerror(5)); - 使用方法: //以读的形式打开一个文件,打开失败会返回NULL FILE* pf = fopen("test.txt","r"); //因为我们没有创建test.txt文件,所以程序会报错,它就会生成一个错误码>errno(全局变量),而我们使用strerror()函数来查看程序报错信息; if(pf == NULL) { printf("%sn",strerror(errno)); return 1;//表示程序结束,不继续执行 } fclose(pf);//关闭文件 pf = NULL; return 0; }
二、总结
- 函数功能:
- 自动读取errno的值,并转换成相应的错误信息,并且打印错误信息
- strerror()函数,手动读取errno的值,不会打印错误信息;
- 对于字符串函数,我们往往只需要知道怎么用即可,而如果我们想进一步了解它们的实现原理,我们可以在安装Vs的文件夹里搜索相应的函数.c文件即可,它们都是库函数;
- 我们想要查找一些库函数可以使用的工具有:MSDN
- MSDN 软件包->百度网盘:
链接:https://pan.baidu.com/s/1YPWmuy5gQmGuWOtYFa-13A
提取码:87is
3.本次分享到此结束了,感谢大家的支持爛!我们下次见;



