You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:49:49