C程序未等待用户输入直接退出,waitUntill函数失效问题排查
问题分析与修复方案
嘿,你的代码有两个关键问题导致了当前的异常行为,咱们一个个拆解清楚:
1. 变长数组(VLA)的声明时机错误
你一开始就定义了int array[arrSize];,但这时候arrSize的初始值是0,等于创建了一个长度为0的空数组。之后你才通过scanf读取用户想要的数组大小,但数组的大小在声明时就已经固定了——后续往array[i]里写入数据完全是越界访问,属于C语言里的未定义行为,轻则数据错乱,重则程序直接崩溃。
2. 输入缓冲区残留的换行符导致提前退出
当你用scanf("%d", ...)读取整数时,用户输入数字后按下的回车键(也就是\n字符)会留在输入缓冲区里没被处理。等到waitUntill函数执行时,第一个getchar()会直接读到这个残留的\n,而getchar()返回的\n ASCII值不是0,所以if(getchar())条件成立,直接跳出循环,程序就“不等你按回车”直接退出了。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> void waitUntill(); int main() { int arrSize = 0; // 先获取用户指定的数组大小,再创建数组 printf("What size of array do you want: "); scanf("%d", &arrSize); // 这里使用变长数组,确保arrSize是正整数(也可以用malloc动态分配更安全) int array[arrSize]; printf("Enter %d numbers: ", arrSize); for(int i = 0; i < arrSize; i++) { scanf("%d", &array[i]); } printf("\nYour array is:\t"); for(int i = 0; i < arrSize; i++) { printf("[%d]", array[i]); } waitUntill(); return 0; } void waitUntill() { printf("\n\nPRESS ENTER TO EXIT !!!\n"); // 先清空输入缓冲区里所有残留的字符,直到遇到换行符 while(getchar() != '\n'); // 现在等待用户按下回车 getchar(); printf("\n"); }
修复要点说明
- 调整数组声明时机:把
int array[arrSize];移到scanf读取arrSize之后,这样变长数组的大小才是用户输入的正确值。如果需要支持更大的数组,推荐用malloc动态分配内存(记得用完用free释放)。 - 清空输入缓冲区:在
waitUntill里先通过while(getchar() != '\n');把之前残留的所有字符(包括换行符)都清空,然后再调用getchar()等待用户主动按下回车,这样就能实现真正的“等待输入”效果了。
内容的提问来源于stack exchange,提问作者arniem
相关产品推荐
相关产品推荐

