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

为何C语言中getchar()使用较少?使用getchar()获取输入是否存在问题?

使用getchar()获取输入的问题分析及代码修正

用getchar()获取输入本身没问题,但你写的GetInput函数存在几个关键bug,会导致程序崩溃、内存泄漏或者行为异常:

  • 变量n未初始化:n一开始是随机值,直接用来索引数组会导致非法内存访问,大概率触发段错误,必须初始化为0。
  • getchar()返回值类型错误:getchar()返回int类型(要能容纳EOF这个超出char范围的值),用char接收ch的话,当输入字符是0xFF时会被误判为EOF,导致输入提前终止。
  • 扩容逻辑判断错误:原代码中if (n > buffersize - 1)的条件不合理,当n等于buffersize -1时,再写入字符就会占满缓冲区(因为最后要留一个位置给'\0'),应该改成if (n >= buffersize - 1)提前扩容。
  • 未处理realloc失败的情况:realloc可能因为内存不足返回NULL,直接赋值给buffer会丢失原来的内存地址,造成内存泄漏。需要先把返回值存到临时变量里,确认成功后再替换buffer。
  • EOF场景下的终止符处理:如果循环因为遇到EOF退出,要确保n是合法值,避免写入buffer[n]时越界。

修正后的代码

char *GetInput() {
    char *buffer;
    int ch; // 改为int类型以容纳EOF
    int buffersize = 256;
    int n = 0; // 初始化计数变量

    buffer = malloc(buffersize);
    if (!buffer) { // 检查内存分配是否成功
        return NULL;
    }

    while ((ch = getchar()) != EOF) {
        if (ch == '\n') {
            break;
        }
        // 检查是否需要扩容,预留终止符位置
        if (n >= buffersize - 1) {
            int new_size = buffersize + 256;
            char *temp = realloc(buffer, new_size);
            if (!temp) { // 扩容失败,释放原内存避免泄漏
                free(buffer);
                return NULL;
            }
            buffer = temp;
            buffersize = new_size;
        }
        buffer[n++] = ch;
    }
    // 确保空输入或EOF场景下也能正确添加字符串终止符
    buffer[n] = '\0';
    return buffer;
}

内容的提问来源于stack exchange,提问作者Chill Dog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:40:11