如何正确使用scanf?解决首次调用需输入两个值的问题
问题解决:scanf 强制要求两次输入及菜单逻辑修复
1. 为什么 scanf 要你输入两次?
你的代码里 scanf("%d\n", &n); 中的**尾部换行符 \n**是罪魁祸首。scanf 对格式字符串里的空白字符(包括换行、空格、制表符)的处理逻辑是:会一直读取输入,直到遇到非空白字符才停止。这意味着你输入一个数字后,它会继续等待你输入更多内容,直到你敲入一个非空白的字符才会结束本次读取。
直接修复:删掉格式字符串里的 \n,改成:
scanf("%d", &n);
2. 菜单的 switch 逻辑完全错误
你写的 switch(n != 9) 完全不符合预期。n !=9 是个布尔判断,结果只能是 0(当n=9时)或 1(当n≠9时),所以你的 case 1 到 case8 永远不会被触发,菜单等于白写。
修复方法:直接用 n 作为 switch 的判断对象,同时补充 case9 处理退出,再加个 default 处理非法输入:
switch (n) { case 1: //vvod(); break; case 2: //dobstr(); break; case 3: //del(); break; case 4: //check(); break; case 5: //save(); break; case 6: //upload(); break; case 7: //vyvod(); break; case 8: //sort(); break; case 9: break; // 依赖 while 循环条件自动退出 default: printf("无效选项,请重新输入!\n"); break; }
完整修正后的代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void menu() { int n = 0; //setlocale(LC_ALL, "Rus"); printf("1-input\n2-dobstr\n3-del\n4-check\n5-save\n6-upload\n7-vyvod\n8-sort\n9-exit\n"); while (n != 9) { printf("what do you want to choose\n"); scanf("%d", &n); // 修复:移除尾部\n switch (n) { // 修复:直接判断n的值 case 1: //vvod(); break; case 2: //dobstr(); break; case 3: //del(); break; case 4: //check(); break; case 5: //save(); break; case 6: //upload(); break; case 7: //vyvod(); break; case 8: //sort(); break; case 9: break; default: printf("Invalid option, try again!\n"); break; } } } int main(){ menu(); return 0; }
额外优化建议
如果用户输入了非数字内容,scanf 会读取失败并把无效内容留在输入缓冲区,导致后续循环无限触发错误提示。可以在 scanf 之后添加缓冲区清理代码:
// 在 scanf 执行后添加 while (getchar() != '\n'); // 清空缓冲区里剩余的所有字符
内容的提问来源于stack exchange,提问作者disb4lance
相关产品推荐
相关产品推荐

