C语言字符及字符串函数详解
- 字符分类函数
C语言中有一系列的函数是用来给字符分类的,也就是判断一个字符是属于什么类型的字符。 这些函数的使用都需要包含一个头文件 <ctype.h>。
函数 | 返回值为真满足的条件 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符,例如空格’ ‘,换行’\n’,制表符’\t’等 |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字 0~9,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 islower ( int c );
该函数接受的值为一个int类型的变量(对应字符的ASCII码),若满足条件,返回一个非0的整数,否则返回整数0.
#include<stdio.h>
#include<ctype.h>
int main()
{
printf("A: %d\n", islower('A'));
printf("a: %d\n", islower('a'));
return 0;
}
输出结果:
A: 0
a: 2
- 练习:写一串代码,将字符串中的小写字母转化为大写字母,其他字符保持不变。
#include<stdio.h>
#include<ctype.h>
//练习:写一串代码,将字符串中的小写字母转化为大写字母,其他字符保持不变。
int main()
{
char str[] = "hEllo wOrLd!";
char* ps = str;
while (*ps != '\0') {
//等于0是大写,不等于0为小写
if (islower(*ps)) {
//小写转化为大写为减去('a'-'A')
*ps -= ('a' - 'A');
}
ps++;
}
printf("%s", str);
return 0;
}
输出结果:HELLO WORLD!
- 字符转换函数
C语言提供了2个字符转换函数:
int tolower(int c);//将传入的⼤写字⺟转化为⼩写字母
int toupper(int c);//将传入的小写字⺟转化为大写字母
传入的值为字符的ASCII码值,输出的值也为转化后字符对应的ASCII码值。注:依然需要调用头文件 <ctype.h> 来使用。
通过此函数,我们可以将上述案例改写为:
#include<stdio.h>
#include<ctype.h>
//练习:写一串代码,将字符串中的小写字母转化为大写字母,其他字符保持不变。
int main()
{
char str[] = "hEllo wOrLd!";
char* ps = str;
while (*ps != '\0') {
//等于0是大写,不等于0为小写
if (islower(*ps)) {
*ps = toupper(*ps);
}
ps++;
}
printf("%s", str);
return 0;
}
- strlen( )函数及其模拟实现
- 函数声明
size_t strlen ( const char* str );
需要注意的是:
strlen( )函数的返回值为 size_t,是无符号类型
strlen( )函数的使用需要包含头问件 <string.h>
易错点演示:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "abc";
char str2[] = "abcdefg";
if (strlen(str1) - strlen(str2) > 0)
printf("str1 > str2");
else
printf("str1 < str2");
return 0;
}
输出结果:str1 > str2
通过分析可知,str1 小于 str2,两字符串长度只差应该是小于0的数字,但是由于函数 strlen( ) 的输出结果的类型为size_t,差的结果只能为正数,所以无法显示正确结果。
- strlen( )函数的模拟实现
使用计数器模拟实现:
size_t my_strlen(const char* str)
{
int cnt = 0;
while (*str) {
cnt++;
str++;
}
return cnt;
}
int