前言
作者:小蜗牛向前冲
名言:我可以接收失败,但我不能接收放弃
如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。
本次博主将继续上篇博客对字符串函数进行进一步的补充。
长度受限制的字符串函数介绍
啥长度受限制的字符串函数呢?它是相对于长度不受限制的字符串函数(strcmp,strcpy,strcat)这些函数他们都是遇到'\0'才会停止函数的功能,但这些会存在一些不安全的情况,以strcpy字符串拷贝函数举例,当存放目标字符串空间比源字符串小时,拷贝仍然会进行,从而导致程序崩溃。
所以,为了更加安全的使用相应功能,长度受限制的字符串函油然(strncmp,strncpy,strncant)。下面我会为大家一一刨析。
strncpy函数
定义
参数
strncpy(strDest,strSource,count);
其中的strDest指目标字符串。
strSource指源字符串。
count指要要从源字符串中拷贝到目标字符串的字符个数。
举例实现
int main() { char arr1[5] = "he"; char arr2[10] = "hehewang"; strncpy(arr1, arr2, 4);//受限制的字符串拷贝 printf("%s\n", arr1); return 0; }
下面我们继续模拟实现strncpy函数
char* my_strncpy(char* dest, char* source, size_t count) { assert(dest && source);//断言 char* start = dest;//保存好目标字符串的地址 while (count && (*dest++ = *source++) != '\0') { count--;//每拷贝一个要拷贝的字符就少一个 } if (count)//若conut指的字符个数大于拷贝个数 while (--count) *dest++ = '\0';//超出的部分都置0 return (start); }
对于strncpy是为更加安全的使用字符串拷贝而出现的函数。
功能:
可以根据自己的需求拷贝多少个字符。
头文件:
.
返回值:
返回的是目标字符串的首地址。
strncmp函数
定义
参数
strncmp(str1,str2,count);
返回值
我们知道strncmp和strcmp的功能是及其相似的,但strncmp更加高明的地方是能实现我们想要的字符进行比较。
举例说明
int main() { char* p1 = "abcdfeg"; char* p2 = "abed"; int ret = strncmp(p1, p2, 3); if (ret > 0) { printf("p1>p2\n"); } else if (ret < 0) { printf("p1<p2\n"); } else { printf("p1=p2"); } return 0; }
模拟strncpy
int my_strncmp(const char* p1, const char* p2, size_t count) { assert(p1 && p2);//断言 //首先判断是否相等 while ((*p1 == *p2)&&count) { count--;//每判断一个字符就-- if (count==0) { return 0;//p1==p2 } p1++; p2++; } return (*(unsigned char*)p1 - *(unsigned char*)p2);//返回 }
功能
对字符串经行有限制的比较
头文件
strncat函数
定义
参数
strncat(dest,Soure,count);
strncat是有限制的追加字符串。
返回值是返回目标字符串的首地址
头文件
举例说明
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { char arr1[10] = "menace"; char arr2[5] = "mehe"; strncat(arr1, arr2, 2); printf("%s\n", arr1); return 0; }
模拟实现
char* my_strncat(char* dest, const char* source, size_t count) { assert(dest && source);//断言 //找到目标字符串的'\0' char* start = dest; while (*dest != '\0') { dest++; } while (count && (*dest++ = *source++))//进行追加 { count--; } *dest = '\0';//在目标字符串末尾放上字符串结束的标志 return start; }
可能有不有疑问,回目标字符串的首地址有上面用呢?我暂时想到的是便于打印字符串。
字符串查找函数
下面我将为大家主要介绍C语言字符串查找函数(strstr,strtok)
strstr函数
定义
参数
strstr(str1,str2);
功能
strstr函数用来寻找子字符串的,是寻找str1中是否存在str2的子字符串
返回值
返回指向 str1 中第一次出现的 str2 的指针,如果子字符串不存在,那么就返回空指针。
头文件
举例说明
int main() { char* p1 = "amcdefme"; char* p2 = "def"; char* ret = strstr(p1, p2);//存储函数的返回值 if (NULL == ret) { printf("子串不存在\n"); } else { printf("%s\n", ret);//打印找到的子字符串 } return 0; }
注意如果出现而份子字符串,函数返回的第一次出现子字符串的首地址。
模拟实现strstr
char* my_strstr(const char* p1, const char* p2) { assert(p1 && p2);//断言 char* s1 = NULL; char* s2 = NULL;//准备二个char*类型的空指针 char* pt = (char*)p1;//存放找到子字符串的起始地址 //判断p2是否为空指针 if (*p2 == '\0') { return (char*)p1;//子字符串必定存在 } //开始查找是否存在子字符串 while (*pt) { s1 = pt;//指向要查找的位置 s2 = (char*)p2;//指向要子字符串 while (*s1 && *s2 && (*s1 == *s2))//逐个分析字符串是否相等,从而推断子字符串是否存在 { s1++; s2++; } if ('\0' == *s2)//说明找到了子字符串 { return pt;//返回子字符串第一次出现的的首地址 } pt++;//没找到继续向下找 } return (char*)NULL;//没找到 }
这个模拟实现还是比较经典的,有兴趣的小伙伴可以动手尝试。
strtok函数
定义
参数
strtok(strToken,strDelimit)
strDelimit参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由strDelimi字符串中一个或者多个分隔符分割的标记。
strtok函数找到strToken中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到strToken中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
strtok举例说明
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { char arr[] = "990.321@321*100";//字符串 char p[] = ".@*";//分隔符 char* ret = NULL; for (ret = strtok(arr, p);ret != NULL;ret = strtok(NULL, p)) { printf("%s\n",ret);//打印分割的字符串 } return 0; }
报告错误信息
下面我将继续为大家分享,报告错误信息函数strerror函数
定义
参数
strerror函数
能够获取系统错误消息 (strerror) 或打印用户提供的错误消息 (_strerror)。
返回值:
strerror 和 _strerror返回指向错误消息字符串的指针。对 strerror 或 _strerror 的后续调用可能会覆盖该字符串。
头文件:
举例说明
char* str = strerror(errno)
//errno是一个全局的错误码的变量
//当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "r");//查找文件 if (pf == NULL) { printf("%s\n", strerror(errno)); } else { printf("open file success\n"); } return 0; }
注意:
我们这里借用fopen函数能够打开文件的函数,其中的参数1(指的是文件),参数2(指的是打开文件的方式)
FILE*是一种指针类型。
这里当系统读不到此文件时,通过strerror(errno)我们能够将错误信息该我们展示出来。
对于strerror函数总结:
strerror()能将代码执行过程中的错误,报出了。
strerror()的参数是1,2,3,4,5.......这类型的错误码,我们可以用errno全局的静态变量接收。
字符分类函数
在c语言中有许多字符分类函数,下面我们用图表来展示:
函数 | 如果他的参数符合下列条件就返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v' |
sdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
显示详细信息
下面我们对部分字符分类函数经行说明
islower函数判断字符是否为小写字母
定义
参数
举例说明
int main() { char ret = 0; scanf("%c", &ret); if (islower(ret) != '\0') { printf("小写字母\n"); } else { printf("不是小写字母\n"); } return 0; }
下面就不继续为大家介绍了,大家兴趣的话,可以动手去研究。
总结
在这篇博客,主要为大家介绍了,strncpy,strncmp,strncat这些受限制的字符串函数;与字符查找函数strstr(查找子字符串),strtok(查找被分隔符分割的字符串);及报告错误信息函数strerror和字符分类函数。