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
相关产品推荐
相关产品推荐

