2013-04-30 69 views
2

I的情況下具有以下輸入:用C解析輸入,scanf的

2 
2 5 
4 6 
1 
1 1 

,其中每個第一數量編碼的情況下遵循的數量。這在ACM問題中很常見。我已經試過成功地使用fgets然後sscanf(我總是最終這樣做:(但是出於好奇,有沒有辦法使用scanf?如果我做了類似的事情,文件指針最終會在哪裏結束

scanf("%d",&x) 
for (f=0;f<x;f++) { 
    scanf("%d %d", &a, &b); 
} 

將這項工作,有沒有用更好的方法只是scanf

+0

是的,如果輸入是格式正確的,那就行了。 – 2013-04-30 00:54:55

+0

@DanielFischer:這通常都是在'while(1)'循環或類似的東西中,我怎麼用第一個'scanf'測試EOF? – 2013-04-30 00:56:46

+0

呃,我想我知道了......這個'while(scanf(「%d」,&cases)== 1)'會起作用,我想......不是嗎? – 2013-04-30 01:00:39

回答

2

如果輸入的是良好的形成 - 因爲你可以期待在線法官 - 模式你有作品

對於示例輸入和循環,輸入最多幷包括'6'將被消耗,在此之後的新行將被下一個scanf呼叫跳過。

這是usuall所有內while(1)環或類似的東西,我怎麼測試EOF與第一scanf函數?

如果你沒有測試用例的數量和需要自行檢測輸入端,使用scanf返回值,

while(scanf("%d", &x) == 1) { 
    for(f = 0; f < x; ++f) { 
     scanf("%d%d", &a, &b); 
     /* do something clever */ 
    } 
} 

如果轉換失敗,你走到了盡頭的輸入,輸入格式不正確,或輸入流已損壞。在這些情況下,你都無法恢復。