《C程序设计语言》习题2.10:lower函数大小写转换失效求助
问题排查与修复
你的代码核心问题出在lower函数的for循环终止条件上:
for (int i = 0; i != '\0'; i++) {
这里判断的是循环变量i是否等于'\0'(也就是数值0),循环一开始i就是0,条件不成立,循环体直接跳过,字符串根本没被处理。正确的逻辑应该是判断当前遍历的字符string[i]是否为字符串结束符'\0',这样才能遍历整个字符串。
修正后的代码
#include <stdio.h> void lower(char string[]); int main(void) { char string[] = "Test String"; lower(string); printf("%s\n", string); } void lower(char string[]) { // 修正循环条件:判断当前字符是否为结束符 for (int i = 0; string[i] != '\0'; i++) { // 用'a'-'A'代替硬编码32,提升代码兼容性 string[i] = (string[i] >= 'A' && string[i] <= 'Z') ? (string[i] + ('a' - 'A')) : string[i]; } }
额外建议
- 避免硬编码数值32:虽然ASCII中大小写字母差值是32,但其他字符集(比如EBCDIC)可能不同,用
'a' - 'A'能保证代码在不同字符集下的正确性。 - 确保字符串可修改:你当前用
char string[] = "Test String"定义的是可修改的字符数组,没问题;如果是char *string = "Test String"这种字符串常量,修改会导致未定义行为,新手要注意区分。
内容的提问来源于stack exchange,提问作者Alfie
相关产品推荐
相关产品推荐

