C语言字符串大写转换函数遇空格失效问题排查与解决
C语言字符串大写转换函数空格后字符失效的问题分析
问题现象
实现了一个C语言字符串大写转换函数,原本逻辑是判断字符是否处于a-z区间,若是则将其ASCII值减32转为大写。但遇到空格时,空格后的字符无法被转换,比如输入"wanna go",期望输出"WANNA GO",实际只输出"WANNA"。修改判断条件为if('a' <= arr[i] && arr[i] <= 'z')后,函数恢复正常。
原错误代码
#include <stdio.h> void capitalizer(char arr[]){ for(int i=0; arr[i]!='\0'; i++) { if('a' < arr[i] < 'z'){ arr[i] -= 32; } } } int main() { char name[] = "wanna go"; puts(name); capitalizer(name); puts(name); return 0; }
错误根源
C语言不支持连续比较的写法,'a' < arr[i] < 'z'的实际执行逻辑是:
- 先计算
'a' < arr[i],这个表达式的结果是布尔值——满足条件返回1,不满足返回0。 - 再用第一步的结果和
'z'比较,也就是判断0 < 'z'或者1 < 'z'。
当遇到空格时,空格的ASCII码是32,而'a'的ASCII码是97,所以'a' < ' '的结果是0。接着0 < 'z'('z'的ASCII是122)成立,代码会进入if分支,把空格的ASCII值减32得到0——也就是字符串结束符'\0'。此时循环条件arr[i]!='\0'直接不满足,循环提前终止,空格后面的字符自然不会被处理。
正确写法
用逻辑与运算符&&连接两个独立的比较条件,确保字符同时满足大于等于'a'且小于等于'z':
void capitalizer(char arr[]){ for(int i=0; arr[i]!='\0'; i++) { if('a' <= arr[i] && arr[i] <= 'z'){ arr[i] -= 32; } } }
更稳妥的优化方案
可以直接使用C标准库的<ctype.h>头文件中的islower()和toupper()函数,避免硬编码ASCII值,代码更安全且可读性更高:
#include <stdio.h> #include <ctype.h> // 需要包含这个头文件 void capitalizer(char arr[]){ for(int i=0; arr[i]!='\0'; i++) { if(islower(arr[i])){ arr[i] = toupper(arr[i]); } } }
内容的提问来源于stack exchange,提问作者Samit Raina
相关产品推荐
相关产品推荐

