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
相关产品推荐
相关产品推荐

