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

C语言中getchar后printf失效及getchar跳读问题求助

C语言REPL代码异常的解决方法

你的代码存在两个致命错误,直接导致了读取异常和输出无响应的问题:

1. 内存初始化错误

memset(&line, '\0', line_length); 这行代码错误地操作了指针变量本身的内存,而非malloc分配的堆内存空间。line是指向堆内存的指针,&line取的是指针在栈上的地址,执行这行后,line的地址会被清零,变成野指针,后续访问line指向的内存会触发未定义行为,这就是后续printf无输出的核心原因。

正确写法:

memset(line, '\0', line_length);

2. 字符类型不匹配

char c; 定义错误,getchar()返回int类型值——要么是0-255的字符ASCII码,要么是EOF(通常为-1)。若用char存储返回值,当char为无符号类型时,EOF会被转成255,导致c != EOF永远为真,程序陷入死循环;即使char是有符号类型,也可能出现类型转换后的判断误差。

正确定义:

int c;

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  // memset所需头文件

int main(int argc, char * argv[])
{
    const size_t line_length = 1024;
    char * line = malloc(line_length * sizeof(char));
    if (line == NULL) {  // 增加内存分配失败判断
        fprintf(stderr, "内存分配失败\n");
        return EXIT_FAILURE;
    }
    memset(line, '\0', line_length);
    int c;
    unsigned short count = 0;

    printf("Enter: ");
    fflush(stdout);  // 强制输出提示语,避免缓冲延迟
    while ((c = getchar()) != '\n' && c != EOF && count < line_length - 1) {
        line[count] = (char)c;
        count += 1;
    }

    printf("Count : %d\n", count);
    printf("%s\n", line);
    printf("End of program.\n");
    free(line);
    return EXIT_SUCCESS;
}

额外优化说明

  • 增加malloc失败判断,避免空指针操作导致崩溃;
  • 在提示语后添加fflush(stdout),解决标准输出行缓冲导致的提示语延迟显示问题;
  • 显式包含string.h头文件,符合C标准编译要求。

验证结果

修正后运行程序,输入hello会得到预期输出:

Enter: hello
Count : 5
hello
End of program.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:03:16