C语言数据管理器程序运行时后续函数未调用问题求助
解决你的C语言简易数据管理器输入后程序直接结束的问题
嘿,我看到你的问题啦!这是个C语言新手非常容易踩的经典小坑,咱们马上来搞定它。
你的核心问题出在choosetask()函数里的scanf调用上:
scanf ("%d", tasknumber);
scanf函数要求传入变量的内存地址,这样它才能把用户输入的值正确写入到变量里。但你直接传了tasknumber这个变量本身,这会导致scanf把输入的值写到一个随机的内存地址上(因为未初始化的tasknumber是垃圾值),这属于未定义行为——程序可能直接崩溃、提前退出,或者出现各种奇怪的现象,这就是你输入后程序直接结束的原因。
修正后的代码
把scanf的参数改成&tasknumber(取地址运算符&用来获取变量的内存地址),修改后的choosetask()函数如下:
void choosetask () { int tasknumber; // 这里要传变量的地址&tasknumber scanf ("%d", &tasknumber); if (tasknumber == 1) { newpatient (); } else if (tasknumber == 2) { assignpatient (); } else if (tasknumber == 3) { loadhospitaldata (); } else if (tasknumber == 4) { deletepatient (); } else if (tasknumber == 5) { exit(0); } else { printf ("Choose a valid task number, please\n"); choosetask (); } }
额外的小建议
另外,你当前用递归调用choosetask()来处理无效输入,虽然能工作,但如果用户多次输入无效值,可能会导致栈溢出。更稳妥的方式是用循环来替代递归,比如:
void choosetask () { int tasknumber; while (1) { scanf ("%d", &tasknumber); if (tasknumber == 1) { newpatient (); break; // 执行完任务后退出循环 } else if (tasknumber == 2) { assignpatient (); break; } else if (tasknumber == 3) { loadhospitaldata (); break; } else if (tasknumber == 4) { deletepatient (); break; } else if (tasknumber == 5) { exit(0); } else { printf ("Choose a valid task number, please\n"); // 不break,继续循环等待正确输入 } } }
这样无论用户输入多少次无效值,都不会有栈溢出的风险。
内容的提问来源于stack exchange,提问作者Mohammed Elbagoury
相关产品推荐
相关产品推荐

