2017-09-04 60 views
2

我編寫了下面的C代碼來檢查一個數組是否存在於其元素由用戶輸入的數組中。但奇怪的是,它跳過了第三條printf聲明,在輸入後直接輸入並打印Enter the number you wish to look for。這是什麼造成的?包含代碼下方的輸入和輸出框。程序檢查數組是否出現在數組中[解決]

CODE

#include <stdio.h> 
#include <stdlib.h> 

    void main() { 
    int arr[30], size, i, num, flag=0; 

    printf("Enter size of array. \n"); 
    scanf("%d",&size); 

    printf("Enter %d array elements one by one. \n",size); 
    for (i=0; i<size; i++) { 
     scanf("%d \n",&arr[i]); 
    } 

    printf("Enter the number you wish to look for. \n"); 
    scanf("%d",&num); 

    for(i=0;i<size;i++) { 
     if (num == arr[i]) { 
      flag++; 
     } 
    } 

    if (flag>0) { 
     printf("The number %d is present in the array.",num); 
    } else { 
     printf("The number %d is not present in the array.",num); 
    } 
} 

輸入/輸出:

Enter size of array. 
5 
Enter 5 array elements one by one. 
1 
2 
3 
4 
5 
5 
Enter the number you wish to look for. 
The number 5 is present in the array. 

你可以看到,Enter the number you wish to look for.應該5前到來,但它並非如此。我相信這只是我失蹤的一些愚蠢的事情。

對不起,任何錯誤,這是我第一次在這裏問一個問題。

編輯:

如果裏面的語句如下循環使用固定它。謝謝大家!

printf("Enter %d array elements one by one. \n",size); 
for (i=0; i<size; i++) { 
    if(arr[i] == arr[size-1]) { 
    scanf("%d",&arr[i]); 
    break; 
    } 
scanf("%d\n",&arr[i]); 
} 

編輯2:

阿呆我。只需通過刪除\n進行修復。不需要if語句。再次感謝你!

+0

您正在使用的scanf ()而不檢查。更偏執。閱讀規範並尋找你沒有想到的事情。如果你找到一些,證明它們不會在你的情況下發生。 – Yunnosch

+0

對不起,我沒有收到你的評論。該程序起作用,唯一的是它首先輸入輸入,然後打印該行。你能指出爲什麼會發生這種情況嗎?再次抱歉。 –

+0

這兩個upvoted答案都談論你使用scanf()。問題是你沒有想到的行爲。我建議閱讀規範並尋找你沒有想到的東西。您可能會發現這對未來的應用程序很有趣:http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html – Yunnosch

回答

2

輸入格式字符串"%d \n"空間告訴輸入系統

消費......從輸入

(描述here)所有可用的連續的空格字符

所以當您輸入最後一個號碼5時,系統現在會嘗試消耗所有空白字符。爲此,它等待額外的輸入,直到它不是空白。所以,反過來說,爲了消費空間,系統必須讀取非空間,這是您輸入的第二個5

要解決這個問題,你可以告訴你的系統僅輸入數字,無需耗費空白:

scanf("%d",&arr[i]); 

然而,這將留在緩衝區中的空白,這可能與後來輸入干擾。爲了丟棄空白,可以使用各種技術,例如, here

在我看來,最正確的方法(但是,也許最神祕的一個)是

scanf("%d%*[^\n]%*c",&arr[i]); 
  • %d - 閱讀次數
  • %*[^\n] - 讀一個字符串,通過一個換行符字節結束;丟棄它,不要將它存儲在任何地方
  • %*c - 讀取一個字節(這是一個換行字節);丟棄它並沒有在你的格式字符串"%d \n" BTW存儲任何地方

,有兩個空格:有規律的空間,最終的行。他們都告訴scanf消耗所有輸入空格。效果與一個空間"%d "或一行尾"%d\n"完全相同,因此這種特殊的格式字符串可能會使讀取代碼的人(包括您自己)感到非常困惑。

2

scanf中,空格字符已經表示任何空格。因此,在您的"%d \n"中,該功能已經在最後一位數字之後立即處理新行,但是您強制它等待另一個換行符。

這會導致程序等待另一行。輸入後,程序繼續並要求搜索號碼,此時輸入已經輸入。

只需要使用scanf只有一個空間,它會爲新行數字本身之前已經理想的工作,這樣你就不需要一個額外的線來完成操作:

scanf(" %d", arr + i); 
+0

謝謝!爲我清理它。 –