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

C语言字符串转大写函数仅输出首个单词的问题如何解决

问题根因

你猜测问题出在while语句的判断是错误的,uppercase函数本身的转换逻辑完全正常。问题出在main函数的输入读取逻辑:
C标准库中scanf("%s", input)的默认读取规则为:遇到任意空白字符(空格、换行符、制表符等)就会终止读取,因此你输入带空格的字符串时,input数组里实际只存储了第一个空格之前的内容,后续字符根本没有被读入程序,自然不会被转换输出。

修复方案

将scanf替换为支持读取整行内容的fgets函数即可,fgets会保留输入中的所有空格,直到遇到换行符或者达到指定的读取长度上限,修改后的完整代码如下:

#include <stdio.h>
// 若需要处理末尾换行符可引入string.h头文件
// #include <string.h>

char *uppercase(char *c) {
    int i = 0;
    while (c[i] != '\0') {
        if (c[i] >= 'a' && c[i] <= 'z')
            c[i] = c[i] - 'a' + 'A';
        i++;
    }
    return c;
}

int main() {
    char input[100];
    printf("Enter the phrase: ");
    // 第二个参数指定最大读取长度,和数组容量一致避免溢出;第三个参数指定从标准输入读取
    fgets(input, sizeof(input), stdin);
    // 可选:去掉fgets读取到的末尾换行符
    // input[strcspn(input, "\n")] = '\0';
    printf("%s", uppercase(input));
    return 0;
}
补充优化建议
  • 原有代码中判断小写字符的逻辑采用硬编码ASCII数值(96、123)的写法,可以替换为c[i] >= 'a' && c[i] <= 'z',可读性和跨平台兼容性更高。
  • fgets会把用户输入时敲的换行符也读入input数组末尾,如果不需要保留这个换行符,可以用注释中的strcspn相关代码处理。

内容的提问来源于stack exchange,提问作者21mustard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:15:04