C语言_字符函数和字符串函数
1. 字符函数
1.1 字符分类函数
在C语言中,有一系列专门做字符分类的函数被包括在头文件<ctype.h>
。
这些函数的区分范围如下:
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格’ ‘、换页’\n‘、回车’\r‘、制表符’\t‘ 、垂直制表符’\v‘ |
isdigit | 十进制数字 ’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 | 任何可打印字符,包括图形字符和空白字符 |
我们来举一个例子来说明这些函数的用法:
int isupper(int C);
isupper
函数可以判断参数部分的C
是否属于大写字母范围。如果是就返回非0整数,如果不是就返回0。
应用:
将字符串中的大写字母转小写,其他字符不变。
#include<stdio.h>
#include<ctype.h>int main(){int i = 0;char str[]="Test String\n";while(str[i]){if(isupper(str[i]))str[i]+=32;putchar(str[i]);i++;}return 0;
}
1.2 字符转换函数
字符转换函数可以大写转小写、小写转大写。
函数使用形式如下:
int tolower(int C);
int toupper(int c);
函数应用如下:
#include<stdio.h>
#include<ctype.h>int main(){int i = 0;char str[]="Test string\n";while(str[i]){if(isupper(str[i]))str[i] = tolower(str[i]);putchar(str[i]);i++;}return 0;
}
2. 字符串函数
字符串函数的使用都需要包含头文件<string.h>
。
2.1 strlen的使用及模拟实现
函数形式如下:
size_t strlen(const char* str);
函数解析及注意事项:
strlen
函数返回的是在字符串中\0
前面出现的字符个数(不包括\0
)- 参数指向的字符串必须要以
\0
结束 - 函数的返回值为
size_t
(无符号整形) strlen
的使用要包含头文件<string.h>
函数的模拟实现:
(1)计数器方式
int my_strlen(const char* str) {int count = 0;assert(str);while (*str) {str++;count++;}
}int main() {char* ch = "abcdef";printf("%d", strlen(ch));
}
(2)不创建临时变量,运用函数递归
int my_strlen(const char* str) {assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}int main() {char* ch = "123456";printf("%d",my_strlen(ch));
}
(3)指针 - 指针
int my_strlen(const char* str) {assert(str);char* p = str;while (*p != 0) {p++;}return p - str;
}int main() {char* ch = "123456";printf("%d",my_strlen(ch));
}
2.2 strcpy的使用及模拟实现
函数形式如下:
char* strcpy(char* destination, const char* source);
函数解析及注意事项:
strcpy
函数的作用是将源字符串拷贝到目标字符串- 源字符串必须以
\0
结束 - 源字符串的
\0
也会被拷贝到目标空间 - 目标空间必须足够大,确保能存放源字符串
- 目标空间必须可修改
函数的模拟实现:
char* my_strcpy(char* dest, char* src) {assert(dest);assert(src);char* ret = dest;while (*dest++ = *src++) {;}return ret;
}int main() {char d[] = "abcdef";char* s = "123";printf("%s", my_strcpy(d, s));return 0;
}
2.3 strcat的使用及模拟实现
函数形式如下:
char* strcat(char* destination, const char* source);
函数解析及注意事项:
strcat
函数的作用是将源字符串追加到目标字符串的后面- 源字符串必须以
\0
结束 - 目标字符串中也得有
\0
,否则没办法知道追加从哪里开始 - 目标空间必须足够的大,能容纳两个字符串的内容
- 目标空间必须可修改
函数的模拟实现:
char* my_strcat(char* dest, char* src) {assert(dest);assert(src);char* ret = dest;while (*dest) {dest++;}while (*dest++ = *src++) {;}return ret;
}int main() {char d[10] = "abcdef";char* s = "123";printf("%s", my_strcat(d, s));return 0;
}
2.4 strcmp的使用及模拟实现
函数形式如下:
int strcmp(const char* str1, const char* str2);
函数解析及注意事项:
strcmp
函数的作用是比较两个字符串的大小(比较两个字符串中对应位置上字符ASCII
码值的大小)- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
函数的模拟实现:
int my_strcmp(char* str1, char* str2) {assert(str1);assert(str2);while (*str1 == *str2) {if (*str1 == '\0') {return 0;}str1++;str2++;}return *str1 - *str2;
}int main() {char* ch1 = "abcdef";char* ch2 = "abcf";if (my_strcmp(ch1, ch2) > 0) {printf("ch1 > ch2");}else if (my_strcmp(ch1, ch2) < 0) {printf("ch1 < ch2");}else {printf("ch1 == ch2");}return 0;
}
2.5 strstr的使用及模拟实现
函数的形式如下:
char* strstr(const char* str1, const char* str2);
函数解析及注意事项:
strstr
函数的作用是返回字符串str2在字符串str1中第一次出现的位置- 字符串的比较匹配不包括
\0
字符,以``\0`作为结束标志
函数的模拟实现:
char* my_strstr(const char* str1, const char* str2) {char* cp = (char*)str1;if (!*str2)return (char*) str1;while (*cp) {//外循环用来刷新开始比较匹配的位置char* s1 = cp;char* s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2)) {//内循环用来比较匹配s1++;s2++;}if (!*s2)//如果s2为\0,说明比较匹配成功return cp;cp++;}return NULL;//如果外层循环已经遍历了一遍还未执行循环内的if语句的话,则说明匹配失败,返回空指针
}
2.6 strncpy的使用
函数形式如下:
char* strncpy(char* destination, const char* source, size_t num);
函数的解析及注意事项:
strncpy
函数的作用是从源字符串拷贝num
个字符到目标空间- 如果源字符串的长度小于
num
,则拷贝完源字符串之后,在目标的后面追加0
,直到num
个
2.7 strncat的使用
函数的形式如下:
char* strncat(char* destination, const char* source, size_t num);
函数的解析及注意事项:
strnca
t函数的作用是将源字符串的前num
个字符追加到目标字符串的末尾,在追加一个\0
- 如果源字符串的长度小于
num
时,只会讲字符串中到\0
的内容追加到目标字符串的末尾
函数使用实例:
#include<stdio.h>
#include<string.h>int main(){char str1[20];char str2[20];strcpy(str1,"To be");strcpy(str2,"or not to be");strncat(str1, str2, 6);printf("%s",str1); return 0;
}
2.8 strncmp的使用
函数形式如下:
int strcmp(const char* str1, const char* str2, size_t num);
函数的解析及注意事项:
- strncmp函数的作用是比较
str1
和str2
的前num
个字符(比较相应位置字符的ASCII
码值) - 比较的规则与
strcmp
相同。
2.9 strtok的使用
函数的形式如下:
char* strtok(char* str, const char* sep);
函数的解析及注意事项:
strtok
函数的作用是将一个字符串分割成几个子字符串sep
参数指向一个用作分隔符的字符串- 第一个参数指定一个字符串,它包含了0个或多个由
sep
字符串中一个或多个分隔符分割的标记 strtok
函数找到str中的一个标记,并将其用\0
收尾,返回一个指向这个标记的指针strtok
函数的第一个参数不为NULL
时,函数将找到str
中第一个标记,strtok函数将保存它在字符串中的位置strtok
函数的第一个参数为NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个标记- 如果字符串中不存在更多的标记,返回
NULL
注:strtok
函数会改变被操作的字符串,所以被strtok
函数切割的字符串一般都是临时拷贝的内容并且可修改
函数的使用:
#include<stdio.h>
#include<string.h>int main(){char arr[] = "192.168.6.111";char* sep = ".";char* str = NULL;for(str = strtok(arr, sep); str != NULL; str = strtok(NULL,sep)){printf("%s\n", str);}return 0;
}
2.10 strerror的使用
函数形式如下:
char* strerror(int errnum);
函数底层逻辑及作用:
- 底层逻辑:在不同的系统和C语言标准库的实现中都规定了一些错误码,放在
<errno.h>
头文件中,C语言程序启动的时候就会使用一个全局的整型变量errno
来记录程序的当前错误码,当程序启动的时候errno
是0
,表示没有错误,当我们在使用标准库中的函数发生错误时,就会减对应的错误码(一个整数)存放在errno
中。每个错误码都对应着一个错误信息。 - 作用:
strerror
函数的作用是把参数部分的错误码对应的错误信息的字符串地址返回。
函数的使用:
#include<stdio.h>
#include<string.h>
#include<errno.h>int main(){FILE* pfile = fopen("unexist.ent","r");if(pfile == NULL)printf ("Error opening file unexist.ent: %s\n", strerror(errno));return 0;
}
同时我们也可以了解一下perror
函数,perror
函数等同于一次将上方代码中的第9行。
#include<stdio.h>
#include<string.h>
#include<errno.h>int main(){FILE* pfile = fopen("unexist.ent","r");if(pfile == NULL)perror("Error opening file unexist.ent");return 0;
}
今天的介绍就到这里,还要请各位佬儿们多多支持,多多点赞