2012-11-16 60 views
0

这里是我的代码:fgets期间的Seg错误?

while (fgets(line, 1000, fp) != NULL) 
    { 
     printf("backin!"); 
     if ((result = strtok(line,delims)) == NULL) 
     printf("Need from_id, to_id, and distance on each line of input file.\n"); 
     else 
     from_id = atoi(result); 
     printf("check!\n"); 
     if ((result = strtok(NULL,delims)) == NULL) 
     printf("Need from_id, to_id, and distance on each line of input file.\n"); 
     else 
     to_id = atoi(result); 
     printf("check!\n"); 
     if ((result = strtok(NULL,delims)) == NULL) 
     printf("Need from_id, to_id, and distance on each line of input file.\n"); 
     else 
     distance = atof(result); 
     printf("check!\n"); 
     printf("from_id: %d, to_id: %d, distance: %f",from_id, to_id, distance); 
     if(BuildGraph(graph_array, from_id, to_id, distance) == -1) 
     printf("Error while filling in graph type"); 
     printf("check!\n"); 
    } 

所有这些用printfs只是定位在段错误发生。输入文件长度为100行,该功能工作15次,完成所有检查,然后在“backin!”之前进行故障排除。打印在第16次迭代。

我翻看输入文件,没有什么可疑的(绝对少于1000个字符),似乎只是fgets的一个问题,但我不知道是什么。

+0

通过您先前询问的问题并接受您认为是好的答案 – mvp

+0

如何定义'行'?足够容纳1000个字符吗? –

+0

哇,就是这样。线保存21个字符,这条线看起来像21,但我想它是22由于某种原因。将其更改为30并且可以正常工作。谢谢。顺便说一句,我可以接受这个答案吗? –

回答

2

确保的line的大小至少为1000个字符或更改代码:

while (fgets(line, sizeof(line), fp) != NULL) 
... 

你需要让你的line大到足以容纳最长的线路或具有逻辑处理部分线路。

+2

+1:这通常是正确的方法(使用'sizeof(line)'),除非缓冲区作为参数传递给调用'fgets()'的函数。然后你需要'char * buffer,size_t buflen'等参数来告诉你缓冲区有多大,并且你调用'fgets(buffer,buflen,fp)'。 –

0

你可以尝试在正则表达式"%[^\n]s"的帮助下使用fscanf。这将接受你的所有令牌,直到行尾字符。

  • 与问题无关,但仍然是,在printf之后使用getch()练习。