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 行に 1 つの数値)。プログラムに 10 個のノードを持つグラフを生成させたいので、10 行と 10 個の 1 を持つファイルがあります。

入力すると:

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

ファイルからの無限の読み取りが開始され、数百のノードが追加されます。ファイルが終了したら、他の操作を実行できるように停止したいと思います。

どうすればこれを達成できますか? 値を手動で挿入するとコードはうまく機能するので、入力関連の問題です。

4

2 に答える 2

1

問題は、 for の戻り値がチェックされていないことscanf()ですEOF。が検出された場合EOFaction変更されません。提案:

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 に答える