2011-05-28 98 views
1

我想從控制檯讀取一些數字。該號碼將出現在這樣 -如何從控制檯輸入數字

5 1 2 3 4 5 
4 5 6 7 8 
6 2 3 4 5 6 7 
.............. 
EOF 

的起始數字代表多少數字將出現在該行,即第一行的第一個數字是5,所以會出現在這條線5個號碼。輸入的結尾將由EOF(文件結束)表示。

我想讀整行作爲一個字符串,然後將它們轉換爲數字,但我想知道是否有任何其他方式來做到這一點。

回答

2

看一看的scanf文件:

int count, current, i; 
while(scanf("%d", &count) > 0) 
{ 
    for(i = 0; i < count; i++) 
    { 
     scanf("%d", &current); 
     // store current 
    } 
} 
+0

你錯過了在for循環中測試scanf的返回值。 – 2011-05-28 14:45:12

+0

當你應該這樣做時,你也無法知道你是否達到了行尾。 'scanf()'會吃早發生的換行符,而忽略延遲發生的換行符。給定數據'1 1 3/1 2'(其中斜線是換行符),第一行將是'OK'(即使它包含2個值,而不是1),並且3將被解釋爲計數對於只有2個值的「第二」行。這就是爲什麼'scanf()'很少使用正確的函數。 (我已經使用了'scanf()',這比我在編程的前25年更加出色!) – 2011-05-28 14:52:29

+0

@Neil Butterworth:我沒有添加它,因爲它沒有在問題中提到,但OP可以做如果需要,提供他讀取'scanf'文檔。 – 2011-05-28 14:53:03

3

'標準' 答案是scanf()。標準答案的麻煩在於,它不會允許您檢查一行中是否有正確數量的數字。所以,你的想法是讀一行,然後把它轉換成零碎,這對錯誤檢測來說更好。

看看How to use sscanf() in loops;那裏的答案向你展示了你應該做什麼的基本知識。這不是一個確切的副本。您將讀取識別行上有多少條目的第一個值,然後是用於將多個條目讀入陣列的代碼,並在數據與所聲明的格式不匹配的情況下進行適當的診斷。

如果您負責數據格式,則應考慮刪除計數字段 - 讓計算機計算線上有多少個值。計算機擅長計數,它消除了要檢測和處理的錯誤來源(因此它使編程更容易)。 (如果你確實改變了輸入格式,你的問題就變成了鏈接問題的重複。)

相關問題