调用searchIt()函数退出异常:输入0无法终止程序问题求助
问题分析与修复:输入0无法退出程序的bug
问题根源
当在searchIt()中输入0时,函数仅break内部循环后返回0,但ch()的while(1)死循环没有终止判断,会直接跳过退出逻辑,继续执行库存修改流程,导致输入0后无法退出。另外原代码中searchIt()的count变量逻辑完全失效(初始化后未被修改),会错误地持续提示"Wrong item number!",不过这并非当前退出问题的直接原因。
修复方案
1. 重构searchIt()的返回值逻辑
让函数通过返回值明确传递退出信号:用**-1表示用户输入0要退出**,避免和合法数组下标0混淆,同时修正count变量的错误逻辑。
2. 在ch()中处理退出请求
调用searchIt()后先检查返回值,若为-1则直接break终止自身死循环,完成退出操作。
修改后的代码
修正后的searchIt()函数
int searchIt(Shop a[], int n) { while (1) { int itemN; printf("Itemnumber(0 to quit): "); scanf("%d", &itemN); if (itemN == 0) { return -1; // 返回-1标记退出请求 } int count = 1; // 初始标记为未找到商品 for (int i = 0; i < n; ++i) { if (itemN == a[i].itemN) { printf("%d\t\t%s\t\t%d\n", a[i].itemN, a[i].name, a[i].inv); count = 0; // 找到匹配项,重置标记 return i; } } if (count) { // 未找到商品时提示错误 printf("Wrong item number!\n"); } } }
修正后的ch()函数
void ch(Shop a[], int n) { while (1) { int input; const int i = searchIt(a, n); if (i == -1) { // 检测到退出请求,终止循环 break; } printf("change inventory: "); scanf("%d", &input); a[i].inv += input; if (a[i].inv < 0) { printf("balance is now 0!\n"); a[i].inv = 0; } } return; }
关键修改说明
- 用返回值-1传递退出意图,彻底区分"退出操作"和"下标为0的商品",避免逻辑混淆。
ch()函数增加返回值判断,收到退出信号后立即终止循环,实现正常退出。- 修复
count变量逻辑,确保仅当输入的商品编号不存在时,才会提示"Wrong item number!"。
内容的提问来源于stack exchange,提问作者totalnewbie
相关产品推荐
相关产品推荐

