仅在Linux上获得无限循环溢出-C

问题描述 投票:0回答:1

我至少被困了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");
}

我非常确定调试是菜单问题...

c
1个回答
0
投票

至少这些问题:

不清除缓冲区

当第一个字符为'\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

也许还有其他麻烦?

© www.soinside.com 2019 - 2024. All rights reserved.