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

