0

我有下一个 C 代码:

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include "graph.h"

int main() {
    int action, src, dst;
    IntGraph g;

    g = newIntGraph();

    while (1) {
        printf("1 -> Add a nodes.\n");
        printf("2 -> Add an arc.\n");
        printf("3 -> Dump the graph.\n");
        printf("4 -> BFS.\n");
        printf("What do you want to do? [1, 2, 3, 4] ");
        scanf("%d", &action);

        switch (action) {
            case 1:
                addIntGraphNode(&g);
                break;

            case 2:
                printf("Insert source and destination: ");
                scanf("%d", &src);
                scanf("%d", &dst);
                addIntGraphArc(&g, src, dst);
                break;

            case 3:
                dumpIntGraph(g, "GRAPH\0");
                break;

            case 4:
                printf("Insert the node to start: ");
                scanf("%d", &src);
                BFSIntGraph(g, src);
                break;

            default:
                return 0;
        }
    }
}

但我需要它来做一些测试,所以我想有一个现成的输入来生成基本图。

我将输入写在一个文件中(每行一个数字)。我有一个包含十行和十个 1 的文件,因为我希望程序生成一个包含十个节点的图形。

当我输入:

./graph-test.run < input/graph-input.txt

它开始并从文件中无休止地读取,添加数百个节点。我希望它在文件完成后停止,让我做一些其他操作。

我怎样才能做到这一点?如果我手动插入值,代码运行良好,所以这是一个与输入相关的问题。

4

2 回答 2

1

问题是没有检查 for 的返回scanf()EOF。如果EOF遇到action将不会被修改。建议:

if (1 != scanf("%d", &action)) /* scanf() returns number of assignments made,
                                  which should be 1 in this case. */
{
    break; /* exit while loop. */
}
于 2012-06-21T14:35:32.040 回答
1

对于每次调用来scanf检查是否返回一个EOF. 在循环EOF中断的情况下。while(1)

if (EOF == scanf(....))
    break; //or exit(0);
于 2012-06-21T14:35:43.333 回答