2012-10-14 74 views
0

我正在使用scanf爲圖形輸入。輸入如下:scanf()給最後一行輸入提供錯誤的輸出

8 
1 2 
3 3 5 6 
2 4 7 
2 3 8 
2 1 5 
1 7 
2 6 4 
0 

第一個整數(8)是頂點數,後面跟着8行。每個中的第一個整數是第一行頂點1,第二行頂點2出來的邊的數量,依此類推。

我寫的功能如下:

void getInput() { 
    //init(); 
    int numVertex; int numTest; 

    scanf("%d", &numVertex); 
    for(int i =1 ; i <= numVertex;i++) { 
     int ver,nC; vector<int> vList; 
     //fscanf(file,"%d", &ver); 
     scanf("%d", &nC); 

     for(int j=0;j<nC;j++) { 
      int temp ; 
      scanf("%d", &temp); 
      vList.push_back(temp); 

     } 
     props pr = {-1,-1 , vList}; 
     graph.insert(make_pair(i, pr)); 
    } 
} 

然而,輸出爲我輸入的最後一行變得怪異,它基本上重複了前行多次的最後一位。對於上面的輸入,我得到的輸出:

1 : 2 
2 : 3 5 6 
3 : 4 7 
4 : 3 8 
5 : 1 5 
6 : 7 
7 : 6 4 
8 : 4 4 // this is where it should give nothing 

誰能告訴我這裏怎麼了?當我轉換爲通過文件輸入時,完全相同的轉換序列爲我提供了正確的輸出。

有人可以請我指出任何錯誤?

+0

請您澄清一下您的輸入格式?目前尚不清楚你的分隔線在哪裏。也不完全清楚你的輸出應該是什麼。 – EFraim

回答

1

做這樣的:

if (scanf("%d", &nC) != EOF) { 

    for(int j=0;j<nC;j++) { 
     int temp ; 
     scanf("%d", &temp); 
     vList.push_back(temp); 

    } 
    props pr = {-1,-1 , vList}; 
    graph.insert(make_pair(i, pr)); 
} 

這將檢查如果讀取成功。最後一行輸入的重複是一個衆所周知的問題,並且發生是因爲上次讀取嘗試失敗(因爲文件結尾已達到)並且scanf返回與先前調用相同的結果。

+0

我認爲不應該將它與EOF進行比較,但是需要預期的字段數 - 在本例中爲1.在第二個scanf中相同。 – EFraim

+0

對於所提及的問題,即重複*最後*行,文件錯誤結束是最常見的問題。因此使用EOF。 –

+0

我建議的支票也會驗證這種情況。 – EFraim

0

什麼是props?不管它是什麼,在包含std :: vector的東西上做C風格的結構體初始化都會遇到麻煩 - 結果是不確定的,而且幾乎肯定不是你想要的結果。

儘管沒有錯誤檢查,但您的輸入代碼似乎還可以,正如另一個答案中所述。