关于getchar()函数输入末尾带空格需两次回车的问题咨询
输入末尾带空格需两次Enter才执行的原因及修复
问题原因
你的代码里两处逻辑共同导致了这个问题:
- 当输入末尾的空格被读取后,进入
while (ch == ' ') ch = getchar();循环,此时会读取到你按下的Enter(即\n),这个换行符会被存进数组。 - 内层读取循环会继续执行
ch = getchar(),但此时输入流已空,getchar()会阻塞等待新输入,所以你必须再按一次Enter才能让代码继续。
具体流程拆解(以输入test +Enter为例):
- 读取完
test四个字符后,读取到空格,进入空格循环,读取下一个字符为\n。 - 退出空格循环后,代码把
\n存入数组,计数器i达到MAX_SIZE-1(即5)。 - 回到内层循环条件,执行
ch = getchar(),此时输入流为空,getchar()阻塞等待新输入。 - 你再次按
Enter,ch被赋值为新的\n,内层循环条件不满足,退出循环。 - 后续清理缓冲区的逻辑跳过,代码才会打印结果。
修复后的代码
#include <stdio.h> #include <ctype.h> #define MAX_SIZE 6 // +1 space for the null terminator int main() { char array[MAX_SIZE] = { 0 }; char ch = 0; while (1) { int i = 0; while ((ch = getchar()) != EOF && ch != '\n' && i < MAX_SIZE - 1) { // 跳过单个空格,直接进入下一轮读取 if (ch == ' ') { continue; } // 大小写转换 if (islower(ch)) ch = toupper(ch); else if (isupper(ch)) ch = tolower(ch); array[i++] = ch; } array[i] = '\0'; // 清理当前行剩余的字符,包括换行符 while (ch != '\n' && ch != EOF) ch = getchar(); printf("%s\n", array); } return 0; }
修复说明
- 把原来嵌套的
while (ch == ' ')改成if (ch == ' ')加continue,遇到空格直接跳过,不会读取后续的换行符并存入数组。 - 保证只有非空格字符才会被处理并存入数组,避免了把换行符误存的情况,也就不会触发后续的
getchar()阻塞。
如果需要跳过所有连续空格,可改用以下逻辑(用goto直接终止读取流程):
while ((ch = getchar()) != EOF && ch != '\n' && i < MAX_SIZE - 1) { // 跳过所有连续空格,遇到换行或EOF直接终止读取 while (ch == ' ') { if ((ch = getchar()) == EOF || ch == '\n') { goto end_read; } } // 大小写转换 if (islower(ch)) ch = toupper(ch); else if (isupper(ch)) ch = tolower(ch); array[i++] = ch; } end_read:
内容的提问来源于stack exchange,提问作者Peter Kirsch
相关产品推荐
相关产品推荐

