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

