2013-08-28 243 views
2

我編寫了一個C程序來從std輸入中選擇數據,該數據以一個數字開始,表示數據集的數量,然後在表單中有N對數據:(xy),所以我寫的代碼如下:讀取數據並用scanf跳過括號

#include <stdio.h> 

int main() 
{ 
    int n_sets; 
    scanf("%d", &n_sets); 
    int i; 
    for(i = 0; i < n_sets; ++i) 
    { 
     int m, n; 
     scanf("(%d %d)", &m, &n); 
     printf("%d\t%d\n", m, n); 
    } 

    return 0; 
} 

但它不起作用。在輸入數據集的編號後,程序直接打印未初始化的m & n。但是當我在(%d %d)之前添加一個空格時,它工作正常。有人可以解釋這一點?

+0

1。檢查從'scanf'返回的值2.使用調試器找出發生了什麼問題 –

+0

這讓我想起'fflush()'.. – Lucio

+0

@Lucio:從我記憶中來看,fflush在stdin上是一個僅限微軟的擴展。 – zentrunix

回答

8

當您在參數scanf()的參數中有字符文字時,它期望完全按照格式字符串中的指定查找這些文字。

scanf("%d", &n_sets); 

正確地讀取n_sets,並且在緩衝器中的換行或其他空白字符停止。接下來scanf()

scanf("(%d %d)", &m, &n); 

希望找到在輸入的開始處的左括號,但發現一個空白字符來代替。所以它失敗了,並且scanf()在沒有任何讀取的情況下返回。因此,您的mn保持未初始化,並且垃圾結果。

當你把空間打開括號之前,像這樣:

scanf(" (%d %d)", &m, &n); 

它告訴scanf()輸入緩衝區的括號之前跳過任何前導空格,所以該程序正常工作。

+0

謝謝,我明白了!清楚地說明了 – jfly

2

變化

scanf("%d", &n_sets); 

scanf("%d\n", &n_sets); 

,並輸入您的n_sets用[Enter]鍵,它的工作結束了。

enter image description here

+0

從verbose查看上面的答案。他很好地解釋了究竟發生了什麼。 – Darwing

+0

@ Zenfeuer我同意並投票贊成 – vvy

+0

FYI:將「%d」更改爲「%d \ n」或「%d」或「%d \ t」等將具有相同的效果。在每種情況下,格式中的空格字符都將與_any_空格匹配。 – chux

1

這聽起來像輸入到程序中有你想scanf函數解析值之前空白的一些量。字符串中的空格告訴scanf忽略空白。沒有它,scanf正在尋找一個完全匹配。

2

假設你的輸入是這樣的:

2 (1 2) (3 4) 

還有就是第一個數字後面輸入一個空格(或新行?),所以在循環改變scanf到:

scanf("\n(%d %d)", &m, &n); 
//  ^^ 
+0

。謝謝! – jfly