1. 程式人生 > >C語言,以空格為分割,以回車為結束標記,輸入一串數字到一個int陣列中

C語言,以空格為分割,以回車為結束標記,輸入一串數字到一個int陣列中

分析例如 int a[100];
輸入:1,2,3,4,5,6(回車換行)

結果:陣列的0-5號元素分別是上述值,打印出來,之後程式結束。

難點:獲取int型的數字輸入不難,scanf("%d",&n);這個只能得到int值,會自動濾出空格和回車換行,如何判斷輸入結束?

錯誤程式碼:

	<pre name="code" class="html">while(scanf("%d",&a[i++]) != '\n' )
{}

這個沒有辦法獲取到最後的結束標誌,一直在迴圈中。

學習:

   while(1) 
    { 
        scanf("%d",&a[i++] ); 
        
        if( getchar() == '\n') 
        { 
        	
            break; 
        } 
    } 
瞭解C程式的執行方式:編譯執行,程式阻塞在迴圈中的第一句 scanf("%d",&a[i++]),等待鍵盤輸入,輸入完成,輸入內容放在鍵盤緩衝區,enter鍵按下,觸發執行。同時enter鍵也是鍵盤輸入,也會進入鍵盤緩衝區。假設輸入是1 2 3 4回車。scanf讀走1,getchar()讀走空格,最後getchar()讀走回車換行符,break。

TIPS:瞭解getchar(),原型 int getchar(void);函式的返回值為使用者輸入的第一個字元的ASCII碼,若出錯返回-1,且將使用者輸入的字元回顯到螢幕。如果使用者在按回車鍵之前輸入了不只一個字元,其他字元會保留在鍵盤緩衝區中,等待後續getchar()呼叫讀取。也就是說,後續的getchat()呼叫不會等待使用者按鍵,而是直接讀取緩衝區中的字元,直到緩衝區的字元讀取完畢後,才等待使用者按鍵。



【說明】getchar()非真正函式,而是getc(stdin)巨集定義。(引自C語言中文網)

讀入型函式具有阻塞性。

嘗試理解這個程式的輸出結果

#include<stdio.h>

int main() 
{ 
    int data[40]; 
    int i = 0; 
    int pos = 0; 
    char ch;
 
    printf("please input a series num:\n"); 
 
    while(1) 
    { 
        scanf("%d",&data[pos] ); 
        printf("%d",data[pos]); 
        pos++;
        printf("%c",ch=getchar());   //這個讀的是什麼?回車還是空格 
        printf("%c",ch = getchar());
       
    } 
 
 	return 0;
} 
鍵盤緩衝區也是有指標的,輸入1 2 3 4 5回車換行

輸出 :

2和3之間的那個空格被scanf("%d",&data[pos])跳過了,跳過了就不會再回頭讀那個空格。