2014-11-01 49 views
0
#include<stdio.h> 

void main(){ 
    int num1,num2; 
    printf("\n Enter number 1 \t "); // Ask for input one. >>>>>>>> line 1. 
    scanf("%d ",&num1); 
    printf("\n Entered number is %d \n",num1); 

    printf("\n Enter number 2 \t "); // Ask for input Two. >>>>>>>>> line 2. 
    scanf("%d ",&num2); 
    printf("\n Entered number is %d \n",num2); 
return; 
} 

我想知道REASON。請提供它。在被要求從用戶輸入之前,scanf輸入輸入的好奇性質?

上述代碼接受兩個輸入,第一輸入被要求(通過執行第1行)然後用戶輸入一個號碼,然後終端應該問進入第二輸入,而是它正在採取其它數量(執行LINE2前)和然後要求輸入第二個輸入(即在執行第二行之後)。

到底是被顯示兩個輸入正在執行線兩條採取後,在執行第1行

我confused.I很有興趣知道原因。 我在ubuntu 14.04 64位機器上使用GCC 4.8.2。

+0

這是工作perfectly..http://ideone.com/Xy9d3A – Blackhat002 2014-11-01 10:06:15

+1

你有沒有閱讀文檔[scanf(3)](http://man7.org/linux/man-pages/man3/scanf.3.html)(你應該測試它的結果)和[stdio(3)](http:// (您可能需要致電[fflush(3)](http://man7.org/linux/man-pages/man3/fflush.3 .html)在適當的地方)? – 2014-11-01 10:07:14

+0

可能重複的[從標準輸入刷新stdout嗎?](http://stackoverflow.com/questions/2123528/does-reading-from-stdin-flush-stdout) – ninjalj 2014-11-01 10:23:45

回答

3

刪除訪問說明符的scanf之間的空格。

scanf("%d ",&num1); 

scanf("%d",&num1); 

因爲scanf函數得到另一個值,由於該空間。

並保存在緩衝區中。內存獲得後,它被分配。

它適用於所有scanf功能。

如果我輸入像

Enter Number1  1 
2 

Entered number is 1 

Enter number2  3 

Entered number is 2. 
+0

先生,我可以知道原因嗎?謝謝,它刪除空格後工作。 – alpha9eek 2014-11-01 10:19:49

+1

+1,有時看起來很明顯的答案比正確的答案投票得多。 – 2014-11-01 10:30:49

+0

@ adambure21,閱讀haccks建議的鏈接https://stackoverflow.com/questions/20069718/how-terminate-scanf-without-entring-the-value – Chandru 2014-11-01 12:45:04

1

你需要把

fflush(stdout); 

scanf

這將刷新你的緩衝區

(也是一個好主意,檢查返回值爲scanf

+0

先生,我想知道原因。 – alpha9eek 2014-11-01 10:20:24

+1

http://en.wikipedia.org/wiki/Aristotle - 或者東西只是在記憶被沖刷之前。或者閱讀scanf的手冊頁,以瞭解返回值 – 2014-11-01 10:22:32

+1

否,如果這是原因,則輸出順序不會改變。 – 2014-11-01 10:28:37

2
  • 這是更好地使用int main(),最後寫return 0;
  • 使用fflush(stdout);刷新你的緩衝區。

編輯這裏之後是最後的代碼

#include<stdio.h> 

int main(){ 
    int num1,num2; 
    printf("\n Enter number 1 \t "); // Ask for input one. >>>>>>>> line 1. 
    scanf("%d ",&num1); 
    printf("\n Entered number is %d \n",num1); 

    printf("\n Enter number 2 \t "); // Ask for input Two. >>>>>>>>> line 2. 
    fflush(stdout); 
    scanf("%d ",&num2); 
    printf("\n Entered number is %d \n",num2); 
return 0; 
} 

這裏是Demo.

1

你給了%d在scanf的空間。如果刪除空格之後%d程序會運行

0

讓我們藉此徐徐

#include <stdio.h> 
// void main(){ 
int main(void) { 
    int num1, num2; 
    printf("\n Enter number 1 \t "); 
    scanf("%d ",&num1); 
    printf("\n Entered number is %d \n",num1); 
... 
  1. 使用正確的函數簽名爲main() - 但不是主要問題。

  2. 代碼輸出 「\ n輸入數字1 \ t」 的

  3. "%d"引導scanf()掃描文本轉換爲一個int在3個步驟:
    甲:掃描可選的前置空白樣'\n''\t'' '。把它們丟掉。 B:掃描表示像「+1234567890」這樣的整數的文本。如果找到任何數字,請將轉換後的結果保存到地址&num1。 C:在步驟B繼續掃描,直到發現不屬於intchar。那char是「未讀取」並返回到stdin

  4. (這是你遇到麻煩的@Chandru的建議)" "指導scanf()掃描任何數字(0或以上)白色空間,包括'\n''\t'' '等。然後他們被扔掉 - 沒有保存。 B:掃描繼續 !!直到找到一個非空白區域。那char是「未讀取」並返回到stdin

  5. 最後scanf()返回值1,因爲這是多少個字段說明符被轉換。代碼可悲的是沒有檢查這個值。

召回stdin通常行緩衝,這意味着輸入不提供給用戶,直到IO輸入被擊中。

用戶輸入 輸入scanf()掃描 「123」,並保存到123&num1。然後它掃描「\ n」,因爲這是步驟4中的空格。並且它繼續等待更多空格

用戶輸入 輸入和第一scanf()其尚未完成,掃描'4',認爲它不是一個空白空間並且在stdin提出'4'回來。輸入2行後最終返回scanf()。此時「456 \ n」正在等待stdio後續scanf()

然後第二個scanf()永久性地解決了這個問題。

推薦使用fgets()只爲所有的用戶輸入,至少直到你是非常熟練的C.

printf("\n Enter number 1 \t "); 
char buf[100]; 
fgets(buf, sizeof buf, stdin); 
if (sscanf(buf, "%d", &num1) != 1) Handle_BadInput(); 
else printf("\n Entered number is %d \n",num1);