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

C语言作业中getchar()赋值给char数组致终端冻结的问题求助

问题分析与修复

你的代码存在两个关键问题,直接导致了终端冻结的现象:

1. 错误使用比较运算符而非赋值运算符

在处理换行符的分支中,你写了str[i] == '\0';——这是相等比较操作,并没有把字符串结束符赋值给数组元素。正确的写法应该是单等号赋值:str[i] = '\0';。这个错误会导致函数无法在读取到换行符时终止,会持续进入循环读取字符。

2. 未处理getchar()的EOF返回值

getchar()返回int类型,它的返回值不仅包含字符的ASCII值,还会返回EOF(通常定义为-1),用来表示输入结束(比如用户按下Ctrl+D/Ctrl+Z)或者读取错误。如果直接把EOF赋值给char类型变量:

  • 若你的系统中char是无符号类型,EOF(-1)会被转换为0xFF(255),这个值永远不等于'\n',循环会无限执行,导致终端冻结。
  • 即使char是有符号类型,不处理EOF也会在输入结束时陷入死循环。

修复后的完整代码

#include <stdio.h>

#define LENGTH 100

void readLine(char str[], int length){
    int i = 0;
    int ch; // 用int存储getchar返回值,正确处理EOF
    if(length < 1) return;
    
    while(1){
        ch = getchar(); 
        // 优先处理输入结束或读取错误的情况
        if(ch == EOF){
            str[i] = '\0';
            return;
        }
        // 处理换行符,终止循环并添加字符串结束符
        if(ch == '\n'){
            str[i] = '\0';
            return;
        }
        // 数组未满时,将字符存入数组并移动索引
        if(i < length - 1){
            str[i] = ch;
            i++;
        }
        // 数组已满时,直接丢弃后续字符直到换行或EOF
    }
}

int main(){
    printf("String? ");
    char inputString[LENGTH];
    readLine(inputString, LENGTH);
    printf("You entered: %s\n", inputString);
    return 0;
}

额外说明

  • 必须用int类型变量存储getchar()的返回值,这样才能正确区分EOF和普通字符。
  • 数组满了之后,要继续读取字符直到换行或EOF,避免剩余字符留在输入缓冲区影响后续的输入操作。

内容的提问来源于stack exchange,提问作者yuechen Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:40:31