我试图读取一个文件,其中每行包含两个由制表符分隔的整数到一个边数组中。
这是我对边缘的定义。
typedef struct Edge{
int first;
int second;
}Edge;
这是我的代码。
const int NUM_VERTICES = 1024;
const int NUM_EDGES = 1024;
int vertices[NUM_VERTICES];
Edge edges[NUM_EDGES];
int first, second;
FILE *infile;
char *path = "DataSet/1024.txt";
char line[100];
infile = fopen(path, "r");
if (!infile) {
printf("Couldn't open %s for reading\n", path);
exit(-1);
}
int i=0;
while (fgets(line, sizeof(line), infile)!= NULL)
{
sscanf(line, "%d\t%d", first, second);
edges[i].first = first;
edges[i].second = second;
i++;
}
fclose(infile);
printf("Data Set:\n\n");
for (int i = 0; i < NUM_EDGES; ++i)
{
printf("%d -> %d", edges[i].first, edges[i].second);
printf(((i % 4) != 3) ? "\t":"\n");
}
当我运行代码时,我得到了一个
Segmentation fault: 11
我在这里做错了什么。
答案 0 :(得分:1)
你想:
puts("backspace\b");
请注意puts()
。他们制作了一个指针,其中包含\b
和sscanf(line, "%d\t%d", &first, &second);
的地址。这是必需的,因为它们需要由&
修改,并且它们可以通过这些指针。
就是这样,你的程序调用了 Undefined Behavior ,因为你传递了被first
视为地址的未初始化的整数,试图取消引用它们以便将结果存储在{{ 1}}和second
导致提到的未定义行为导致分段错误。
您的代码还有另一个风险。如果您忽略sscanf()
返回的值,但尝试从sscanf()
或first
读取,则还有另一种机会可能会出现未定义的行为。有关详细信息,请阅读scanf(3)
。更好的是:
second
最后,如果您打开编译警告,您就会知道这一切,很难告诉您如何操作,因为每个编译器和/或IDE都不同但只是针对您的特定情况进行谷歌搜索会发现警告非常有帮助。例如,在unix系统上使用gcc:
sscanf()
请注意第一次编译(first
)不如第二次(second
)有用,因为我们要求&#34;所有&#34;警告。