我至少被困了6个小时才发现菜单驱动程序出了什么问题。
基本上,我参加了一次考试,要通过考试,我必须验证2个测试用例,其中在特定的input.txt文件对应于output.txt文件
现在是有趣的部分。在Liux上的SAME程序在一个测试用例上无法正常工作,而在另一个测试用例上,SAME菜单代码正在导致永无休止的菜单操作,如选择变量中始终包含某些内容。当然,在Windows上,一切都按预期工作。
任何人都可以帮助我吗?我快疯了。...
编辑:我像这样运行程序“ ./main 关于图书馆,首先您必须插入所有书籍并将它们保存到列表中,其次显示菜单,要求您搜索,租借或带回书籍,如果选择等于5,则打印目录或退出。 实际上,问题是在将所有书籍插入程序后开始的,菜单不等待用户输入,而只是开始在无限循环中执行随机动作。 这是代码: 我非常确定调试是菜单问题...void menu(ptr head) {
//Array di funzioni per gestire le prime 4 scelte: la scelta di uscita dal programma e' gestita direttamente dal ciclo
void (*chose[4])(ptr*) = { print_catalogue, search_book, rent, bring_back };
int scelta = 0;
// for infinito per poter validare meglio l'input
for (;;) {
printf("Scegli un opzione:\n1) Stampa catalogo.\n2) Cerca.\n3) Prestito.\n4) Restituzione.\n5) Esci.\nScelta: ");
if (scanf("%d", &scelta) != 1 || scelta < 1 || scelta > 5) {
printf("Errore. Scelta non valida.\n");
// clean the buffer
scanf("%*[^\n]%*1[\n]");
}
else if (scelta == 5) { // devo uscire dell'intero programma
break;
}
else { // ho inserito un numero valido, posso procedere
// clean the buffer
scanf("%*[^\n]%*1[\n]");
(*chose[scelta - 1])(&head);
}
}
// programma terminato libero la memoria
freeList(&head);
puts("Bye");
}
至少这些问题:
不清除缓冲区
当第一个字符为'\n'
时,以下内容无法使用'\n'
之前的所有文本。
// clean the buffer
scanf("%*[^\n]%*1[\n]"); // weak
// scanf() stop on first specifier when input is `\n`
相反,使用2个电话
scanf("%*[^\n]");
scanf("%*1[\n]");
缺少文件结尾检测
[由于文件末尾scanf("%d", &scelta)
返回EOF
时,OP的代码将永远循环。
// if (scanf("%d", &scelta) != 1 || scelta < 1 || scelta > 5) {
int cnt = scanf("%d", &scelta);
if (cnt == EOF) break;
if (cnt != 1 || scelta < 1 || scelta > 5) {
确保输出被刷新
打印后冲洗。
printf("Scegli un opzione:\n1) Stampa catalogo.\n2) Cerca.\n3) Prestito.\n4) Restituzione.\n5) Esci.\nScelta: ");
fflush(stdout); //Add
也许还有其他麻烦?