ctype.h
<ctype.h> 提供字符分类和转换函数。这些函数接受 int 参数(必须是 EOF 或 unsigned char 值),返回分类结果或转换后的字符。正确处理字符类型是文本处理、解析器、输入验证的基础。
字符分类
#include <ctype.h>
char c = 'A';
isalpha(c); /* 字母:A-Z, a-z */
isdigit(c); /* 数字:0-9 */
isalnum(c); /* 字母或数字 */
isspace(c); /* 空白:空格、\t、\n、\r、\f、\v */
isupper(c); /* 大写字母 */
islower(c); /* 小写字母 */
isprint(c); /* 可打印字符 */
ispunct(c); /* 标点符号 */
字符转换
char c = 'A';
char lower = tolower(c); /* 'a' */
char upper = toupper('b'); /* 'B' */
使用示例
统计单词:
int count_words(const char *str)
{
int count = 0;
int in_word = 0;
while (*str) {
if (isalnum(*str)) {
if (!in_word) {
count++;
in_word = 1;
}
} else {
in_word = 0;
}
str++;
}
return count;
}
大小写转换:
void to_uppercase(char *str)
{
while (*str) {
*str = toupper(*str);
str++;
}
}
常见错误
char 符号问题:
char c = 'é'; /* 假设扩展 ASCII,值为 0xE9 (-23) */
/* 错误:传入负值 */
isalpha(c); /* 未定义行为! */
/* 正确 */
isalpha((unsigned char)c);
修改不可修改字符:
char *str = "Hello";
*str = toupper(*str); /* 未定义行为:字符串字面量只读 */
/* 正确 */
char str[] = "Hello";
str[0] = toupper(str[0]);
最佳实践
- 传入
unsigned char转换后的值 - 不假设字符编码(ASCII 之外)
- 用标准函数而非手动检查范围
- 注意
char可能是有符号的 - 宽字符用
<wctype.h>