scanf和getchar

寫個簡單的小代碼,發現用scanf在處理回車空格上面,有點。。網上找了資料,自己也動手試下,結果如follow:

#include<stdio.h>
int main()
{
char a1,b1;                                            //int a1,b1;                                              //char a1[10],b1[10];
scanf("%c",&a1);   //a1=getchar();  //scanf("%d",&a1);  //a1=getchar(); //scanf("%s",a1);    //gets(a1);
scanf("%c",&b1);   //b1=getchar();  //scanf("%d",&b1);  //b1=getchar(); //scanf("%s",b1);    //gets(b1);
printf("%d\n",a1);                                                                                                 //printf("%s\n",a1);
printf("%d\n",b1);                                                                                                 //printf("%s\n",b1);

return 0;
}

scanf接收兩個字符型數據送入a1,b1,將其ASCII碼打出;;輸入a空格b回車;;輸出97、35,而不是98。35爲空格的ACSII碼值,可以在調試器中觀察到,b1接收的是‘ ’而非b,將scanf用getchar()代替結果是一樣的;這裏把輸入形式改爲a回車b會發現,不論是scanf還是getchar都沒等我們輸入b就執行結束了,也是把回車作爲字符輸入到b1中了;

總的來說,對於輸入數據類型爲char來說,scanf和getchar一樣,接受輸入緩衝中的空格、回車、Tab;


但是,我們平時使用scanf接受數據時多數還是不會遇到接收space的情況,上面的例子,把a1、b1的類型改爲int型時,用scanf,空格、回車是不會被接收的(也就是被丟棄),而對於getchar來說還是會把輸入作爲char類型數據接受,傳給a1,b1時進行一次類型轉換,結果就同之前沒有什麼差別。

scanf、getchar接收字符串string時,如上,使用scanf接收字符串時,輸入 i love you 輸出爲i換行love,即scanf把i作爲一個字符串,love作爲一個字符串。而使用gets接收字符串時,輸入 i love you回車還會是等待輸入的狀態,再輸入 me too!回車,輸出顯示爲 i love you 換行me too!。由此可見,scanf從輸入緩衝中取字符串型數據的時候,遇到空格、回車、Tab都會結束此次取字符串,因此,要用scanf接收一個字符串的時候,中間不能有回車、空格、Tab這些;而gets接收的字符串中間可以有空格、Tab,它只以回車作爲結束標誌;


從hao5473博客上還有看到一個以前遇到的,但一直不明所以也沒有注意的問題,就是getchar的“暫停”功能

之前就有遇到,運行程序的時候,結果只是一閃而過,詢問superior之後,知道用getchar();可以,但是後來也是發現,有時候行不通。

原來~ getchar()可以用來等待接受我們的結束輸入(ENTER),我們沒有輸入,getchar從輸入緩衝中取不到東西,程序就不能終止,知道我們按下ENTER,程序結束;

但是有時候我們的輸入緩衝並不是空的(eg.上文中,scanf接收字符串,我們輸入的是i love you,而scanf只取走了 i love,you還在輸入緩衝中),如果輸入緩衝中還有數據的話,getchar直接讀取數據,結束程序,這時並不能解決結果一閃而過的問題;

清空輸入緩衝的方法:fflush(stdin);



在做oj的時候經常遇到說多組輸入的情況,這時就要不停地掃描是否還有輸入,那麼應該怎樣判斷是否結束呢?

一般來說使用比較多的是while(scanf("%d",&a)!=EOF)...也有使用while(~scanf("%d",&a))...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章