我有下一个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;
}
}
}
但我需要它做一些测试,所以我希望有一个准备好的输入来生成基本图形。
我在一个文件中写入了输入(每行一个数字)。我有一个十行和十一个文件的文件,因为我希望程序生成一个包含十个节点的图形。
当我输入:
./graph-test.run < input/graph-input.txt
它从文件开始并无休止地读取,添加了数百个节点。我想在文件完成后停止让我做其他操作。
我怎样才能做到这一点?如果我手动插入值,代码就可以正常工作,因此这是一个与输入相关的问题。
答案 0 :(得分:1)
问题是没有检查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. */
}
答案 1 :(得分:1)
每次拨打scanf
时,请检查是否返回EOF
。如果EOF
突然出现while(1)
循环。
if (EOF == scanf(....))
break; //or exit(0);