C语言输入终止问题求助:文本转大写程序无法停止输入
修正后的C语言文本转大写程序
以下是修复所有问题后的完整代码,可处理多行带空格的输入,转换为大写后输出,并能正确终止:
#include <stdio.h> #include <ctype.h> #include <string.h> #define MAX_LINE_LENGTH 1024 int main() { char line[MAX_LINE_LENGTH]; // 循环读取每行输入,直到输入流结束 while (fgets(line, sizeof(line), stdin) != NULL) { // 移除fgets读取到的换行符(如果存在) size_t line_len = strlen(line); if (line_len > 0 && line[line_len - 1] == '\n') { line[line_len - 1] = '\0'; } // 逐个字符转换为大写 for (int i = 0; line[i] != '\0'; i++) { line[i] = toupper((unsigned char)line[i]); } // 输出转换后的内容 printf("%s\n", line); } // 区分正常结束和读取错误 if (feof(stdin)) { printf("\n输入已终止\n"); } else { fprintf(stderr, "读取输入时发生错误\n"); } return 0; }
针对问题的具体修复说明:
替换
scanf("%s")读取整行:scanf("%s")会在空格、制表符或换行符处停止读取,无法处理带空格的文本。改用fgets()可以读取包含空格的整行内容,它会读取到换行符或达到缓冲区上限为止。代码中额外处理了fgets保留的换行符,避免输出时出现多余空行。修复语法错误:
直接移除了不完整的if(s == )语句,转大写逻辑改为遍历字符串的每个字符,调用标准库函数toupper()(需要包含<ctype.h>头文件)。将字符转为unsigned char传入toupper(),避免处理负数字符值导致的未定义行为。添加输入终止判断:
循环条件fgets(...) != NULL会在用户按下Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)触发输入流结束时退出循环。之后用feof(stdin)判断是否是正常终止,区分输入错误的情况。
内容的提问来源于stack exchange,提问作者NgoMinh
相关产品推荐
相关产品推荐

