C语言char变量异常:do while循环菜单二次输入无响应问题排查
问题原因与解决方法
核心问题:输入缓冲区残留的换行符干扰
当你在case 'a'中执行scanf("%d", &x)时,输入数字后按下的回车键会留下一个\n在输入缓冲区里。下一次循环执行scanf("%c", &pick)时,会直接读取这个残留的换行符,而不是你输入的菜单选项,再加上后面的getchar()又会读取下一个字符,导致程序出现无响应的假象。
解决步骤
- 优化菜单选项的输入:把
scanf("%c", &pick)改成scanf(" %c", &pick)(注意%c前的空格),这个空格会自动跳过输入缓冲区里的所有空白字符(包括换行、空格、制表符),不需要再单独调用getchar(),避免重复处理。 - 处理数字输入后的换行符:如果保留原来的写法,就在
scanf("%d", &x)之后加一句getchar(),把残留的换行符吃掉;或者同样给scanf("%d", &x)改成scanf(" %d", &x),靠空格自动跳过空白字符。 - 修复数组越界问题:你的循环里
for (int i = 1; i <= x; i++)是错误的,C语言数组下标从0开始,应该改成for (int i = 0; i < x; i++),否则会访问到数组外的内存,引发未定义行为。
修改后的完整代码
int main() { char pick; int x; int *a; do { printf("Menu of task\n"); printf("a.Generate an array:\n"); printf("b.Sort a given array of names to increasing alphabet\n"); printf("q.Quit\n"); // 用带空格的scanf跳过空白字符,不需要getchar() scanf(" %c", &pick); switch (pick) { case 'a': printf("Input N:\n"); // 同样用带空格的scanf处理数字输入 scanf(" %d", &x); a = tax(x); // 修正数组遍历的下标范围 for (int i = 0; i < x; i++) printf("%d ", *(a + i)); printf("\n"); // 记得释放动态分配的内存,避免内存泄漏 free(a); break; case 'b': printf("Nah:\n"); break; case 'q': printf("Out!"); break; default: printf("Wrong syntax\n"); break; } } while (pick != 'q'); return 0; }
补充:如果tax()函数是用malloc动态分配内存的话,记得在使用完数组后调用free(a),避免内存泄漏。
内容的提问来源于stack exchange,提问作者trimai_
相关产品推荐
相关产品推荐

