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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:08:34