C語言,以空格為分割,以回車為結束標記,輸入一串數字到一個int陣列中
阿新 • • 發佈:2019-01-01
分析:例如 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' )
{}
這個沒有辦法獲取到最後的結束標誌,一直在迴圈中。
學習:
瞭解C程式的執行方式:編譯執行,程式阻塞在迴圈中的第一句 scanf("%d",&a[i++]),等待鍵盤輸入,輸入完成,輸入內容放在鍵盤緩衝區,enter鍵按下,觸發執行。同時enter鍵也是鍵盤輸入,也會進入鍵盤緩衝區。假設輸入是1 2 3 4回車。scanf讀走1,getchar()讀走空格,最後getchar()讀走回車換行符,break。while(1) { scanf("%d",&a[i++] ); if( getchar() == '\n') { break; } }
TIPS:瞭解getchar(),原型 int getchar(void);函式的返回值為使用者輸入的第一個字元的ASCII碼,若出錯返回-1,且將使用者輸入的字元回顯到螢幕。如果使用者在按回車鍵之前輸入了不只一個字元,其他字元會保留在鍵盤緩衝區中,等待後續getchar()呼叫讀取。也就是說,後續的getchat()呼叫不會等待使用者按鍵,而是直接讀取緩衝區中的字元,直到緩衝區的字元讀取完畢後,才等待使用者按鍵。
【說明】getchar()非真正函式,而是getc(stdin)巨集定義。(引自C語言中文網)
讀入型函式具有阻塞性。
嘗試理解這個程式的輸出結果
鍵盤緩衝區也是有指標的,輸入1 2 3 4 5回車換行#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; }
輸出 :
2和3之間的那個空格被scanf("%d",&data[pos])跳過了,跳過了就不會再回頭讀那個空格。