【C语言】解决不同场景字符串问题:巧妙运用字符串函数-CSDN博客
成就一亿技术人!
17-21 分钟
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
文章目录
- 2.1 Strlen
- 2.2 Strcpy
- 2.3 Strcat
- 2.4 Strcmp
- 对于strcpy和strcat越界的调整
- 2.5 Strncpy
- 2.6 Strncat
- 2.7 Strncmp
- 2.8 Strstr
- 2.9 Strtok
- 2.10 Strerror
一、字符函数
字符函数一般分为字符分类函数和字符转换函数,它们使用的时候可以相互打配合,这些字符函数统一声明在库函数头文件ctype.h
1.1 字符分类函数
以上这些函数使用方式非常类似,这里简单使用两个常用字符分类函数
1.1.1 islower
#include <stdio.h> #include <ctype.h> int main() { int ret=islower('a') return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7
【说明】:
- 字符类型是整型类型的子集,这里可以使用ASCII表达字符
- 判断参数部分是否为小写字母
- 如果是小写字母,就返回非零的整数(为真)
- 如果不是小写字母,就返回零(为假)
1.1.2 isupper
#include <stdio.h> #include <ctype.h> int main() { int ret=isupper('A') return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7
【说明】:
- 字符类型是整型类型的子集,这里可以使用ASCII表达字符
- 判断参数部分是否为大写字母
- 如果是小写字母,就返回非零的整数(为真)
- 如果不是小写字母,就返回零(为假)
如果对于其他字符分类函数使用感兴趣,可以点击这次链接,经行查找搜索->[字符分类函数](scanf - C++ Reference (cplusplus.com))
1.2字符转换函数
C语言提供了以下两个字符转换函数:
int tolower(int c) 功能:将参数部分为小写转化为大写 int toupper (int C) 功能:将参数部分为大写转化为小写 • 1 • 2 • 3 • 4
int main() { int ret=iolower('A'); printf("%d",ret);//这里打印出的就是小写a return 0; } • 1 • 2 • 3 • 4 • 5 • 6
1.3 字符分类函数与字符转换函数配合
int main() { int i = 0; char str[] = "Test String.\n"; char c; while (str[i++]) { c = str[i]; if (islower(c)) c = toupper(c); putchar(c); } return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 '
二、 字符串函数
2.1 Strlen
int main() { char * p = "abcd"; int ret = strlen(p); return 0; } • 1 • 2 • 3 • 4 • 5 • 6
【说明】:
- 计算字符串在\0前面出现的字符个数
- 具体细节,参考这篇文【指针篇5/5】
2.2 Strcpy
- 将原字符串(source)拷贝到目标字符串(destination)。
- 返回值是返回目标字符串中首地址。
int main() { cosnt char pc[] = "abcdf"; 1. char p[] = "xxx"; //目标空间缺乏 2. char p[] = "XXXXXXxxxx"; //目标空间充足 strcpy(p, pc); printf("%s", p); return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10
【说明】:
- 源字符必须以
'\0'
作为结束标志 - 源字符串中的
'\0'
拷贝到目标空间 - 目标字符串是可修改的
- 目标空间需要足够大,不然可能会溢出
- 如果目标空间过小,虽然能打印结果,但会冲出缓冲区
2.3 Strcat
- 在目标字符串末尾’\0’的位置上追加源字符串。
- 目标字符串的首地址。
int main() { char p[20] = "abcdefl"; const char pc[] = "xxxx"; strcat(p, pc,); printf("%s", p); return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9
【说明】:
- 源字符必须以
'\0'
作为结束标志 - 目标字符串需要
'\0'
作为结束标志,作为追加位置 - 目标字符串是可修改的
- 目标空间需要足够大,空间容纳下两个字符串连接后的大小
2.4 Strcmp
- strcmp不是比较字符串的长度,而是比较两个字符串中对应位置字符的ASCII码值
int main() { char p[20] = "abcdef"; char pc[20] = "abcf"; int ret=strcmp(p, pc); if (ret > 0) { printf("大于"); } else if (ret == 0) { printf("等于"); } else { printf("小于"); } return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19
【说明】:
- 如果第一个字符串大于第二个字符串的大小,就返回大于0的数
- 如果第一个字符串等于第二个字符串的大小,就返回0
- 如果第一个字符串小于第二个字符串的大小,就返回小于0的数
对于strcpy和strcat越界的调整
【问题】:
- 在使用字符串函数中,strcpy和strcat都存在冲出缓冲区的风险,对此有什么办法可以尽量避免?
库为了对应这种情况的发生,提供了在strcpy和strcat基础上改良了可以控制个数的函数。
2.5 Strncpy
【说明】:
- 将源字符串的num个字符拷贝到目标空间中
- 如果num大于源字符串的数量,拷贝完源字符串后,以后追加
'\0'
直到num个才停下
2.6 Strncat
【说明】:
- 将源字符串的num个字符追加到目标空间中
- 如果num大于源字符串的数量,则拷贝到
'\0'
直接停下
2.7 Strncmp
【说明】:
- 比较dest和str的前num个字符,如果在num前发现了不同,则返回数值,不再继续
- 如果dest和str相等,一直到了num个字符都相等,则返回0
2.8 Strstr
- 在字符串中寻找匹配子字符串并且返回子字符串的地址
int main() { char str1[] = "abccdefg"; char str2[] = "cd"; char *ret=strstr(str1,str2); printf("%s",ret); return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 '
【说明】:
- str1和str2不能为
NULL
. - 如果str2不属于str1的字符串,则返回
NULL
.
2.9 Strtok
- 第一个参数指向一个字符串,包括了一个及多个的分隔符和字符组合
- 第二个参数是指向分割符的集合
- 将一个字符串拆分标记,标记是由分隔符分割由任何字符分隔的连续字符串序列
int main() { char str[] = "192.152.142@dads"; char sep[] = ".@"; char* p = NULL; for (p = strtok(str, sep); p != NULL; p=strtok(NULL, sep))//循环中利用上面返回值三点的相关知识 { printf("%s\n", str); } return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11
【说明】:
- 第一个参数不为NULL,则函数找到str1的第一个标记并且记录当下标记的位置
- 第一个参数为NULL,则从标记的位置,出发寻找下一个标记位置
- 如果字符串中找不到更多的标记,则返回NULL.
【循环体逻辑说明】
- 因为使用一次strtok函数,只能找个一个标记点,所以我们需要用到循环
- 字符串中找不到更多的标记,则返回
NULL
,这个作为结束条件 - strtok函数会找下一个标记,以
\0
来结尾,返回指向这个标记的指针(strtok会改变被操作的字符串,所以strtok函数分割得到的字符串,一般是拷贝内容是可以被修改的)
2.10 Strerror
- 获得参数部分的错误码对应的错误信息
- 将错误信息的字符串地址返回
#include <stdio.h> #include <errno.h> int main() { for (int i = 0; i < 10; i++) { printf("%d:%s\n",i, strerror(i)); } return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10
【说明】
- 在不同的系统和C语言标准库的实现中将这一些错误码的信息,一般都放在
<errno.h>
头文件中 - 当C语言程序启动的时候,会有一个全面变量
errno去
记录程序中错误码,在程序启动的是时候,errno为0
,表示没有错误。 - 如果在使用标准库中的函数,出现错误,那么就有会由
errno
去记录错误码,如果错误码是=的数字,不知道什么含义**?所以每一个错误码都对应着错误信息**
讲到这里我们也是可以了解下perror函数,它的功能是直接将错误信息打印出来,比较暴力
#include <stdio.h> #include <string.h> #include <errno.h> int main() { FILE*p=fopen("add.txt","r");//r的意思打开文件进行输入操作。该文件必须存在。 //FILE * fopen ( const char * filename, const char * mode ); if(p==NULL) { perror("Error opening file add.txt:")//Error opening file add.txt: No such file or directory } return 0; } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13
以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!