C語言中getchar()、gets()和scanf()的特點以及scanf產生的多餘回車符問題
第一件事建議大家少用gets函式。
我遇到的這個問題實在是C語言新手比較容易遇到的一個問題。是關於get()和getchar()這兩個函式的。大家都知道,gets()函式作用是輸入字串,而getchar()是輸入單個字元。但在一個小程式中,我發現了它們兩個一些別的用法。
因為原始檔的程式碼很長,所以只打上原始檔中涉及到這個問題的一個函式:
void input(num,name) { int num[]; char name[10][8]; int i; for(i=0;i<N;i++) { printf("\n input number :"); scanf("%d",&num[i]); printf("\n intput name"); getchar(); gets(name[i]); } }
函式是想要輸入十名同學的學號和姓名。
剛開始,我認為在gets函式前有加了一個getchar函式是多餘的。於是我便刪除了開頭的那段程式碼,但是結果卻無法執行。
總是在輸完num[i]的資料後直接跳過了輸入name[i]的過程。
百思不得其解的我只好去翻查資料。
最終我找到了問題的答案。
使用scanf函式,在輸入完字元後,要按一下回車鍵。原本輸入的字元都儲存在快取區中,在按下回車鍵後便被讀取到變數中。但是在按下回車後多餘了一個回車符,getchar()的作用就是把這個回車符讀取掉,否則就被gets()函式讀取,直接跳過了下一個變數的輸入。(此處也可以使用gets())
那麼問題就又出現了,為什麼兩個scanf函式就可以連續使用呢?
這就是gets函式和scanf函式的不同了:
scanf函式在輸入整型資料時不能接受空格、製表符Tab、回車等;
gets函式能夠接受空格、製表符Tab和回車等;
這就是可以連續使用scanf函式的原因。
除此之外,兩者還有不同點:
scanf函式如果輸入了空格(空格鍵和tab鍵)會認為字串結束,空格後的字元將作為下一個輸入項處理,但gets()函式將接收輸入的整個字串直到遇到換行為止。
在這裡也存在一個問題,並不是在所有的scanf後面都要加上getchar()。因為我們產生的回車符為字元,所以只對使用scanf輸入字元時有影響,也在輸入字元前必須把回車符吸收掉。
最後再補充一下這三個函式各自的返回值:
1.scanf函式
scanf函式的返回值可以分成三種情況
1) 正整數,表示正確輸入引數的個數。例如執行 scanf("%d %d", &a, &b);
如果使用者輸入"3 4",可以正確輸入,返回2(正確輸入了兩個變數);
如果使用者輸入"3,4",可以正確輸入a,無法輸入b,返回1(正確輸入了一個變數)。
2) 0,表示使用者的輸入不匹配,無法正確輸入任何值。如上例,使用者如果輸入",3 4",返回0。
3) EOF,這是在stdio.h裡面定義的常量(通常值為-1),表示輸入流已經結束。
2.gets函式
函式原型:char *gets(char *string)
格式:gets(字元陣列或指標);
gets函式的返回值:
1.)正常讀入(未遇到檔案結尾)(注意,讀入空串也是正常讀入),則返回字串,即返回字串首地址,char*型別。
2.)遇到檔案結尾,返回NULL。
3.getchar函式
它的返回值顯而易見。
char a;
a=getchar();
就是我們從鍵盤輸入的一個字元。
文章寫到這裡,我感覺我自己很有必要去看看C語言的各種標準標頭檔案中是怎麼定義這些函式的,對自己的幫助一定很大,要加緊開始了!