2012-11-16 55 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()練習。