1. 程式人生 > >C/C++ scanf 函式中%s 和%c 的簡單區別

C/C++ scanf 函式中%s 和%c 的簡單區別

首先宣告:在鍵盤中敲入字元後,字元會首先儲存在鍵盤緩衝區中供scanf函式讀取(scanf,getchar等函式是讀取緩衝區,getch函式是讀取的控制檯資訊,即為直接從鍵盤讀取)。另外特別注意鍵盤上敲入回車實際為“\r\n”,但儲存到緩衝區時候會捨棄‘\r’而只儲存\n.例如我們敲入字元“12345回車”,緩衝區記憶體儲的為“12345\n”.

文章中“_”代表空格

程式碼:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%s",s);

printf("%s\n",s);

例:

輸入:123_345回車            “_”代表空格

輸出:123

           345

分析:對於scanf以%s格式輸入時候,“空格、換行符、TAB”等是作為兩個資料的分隔符存在的,即分隔符前後是兩個資料,讀入時候分隔符不讀入。

例:

輸入:123回車

        456回車

輸出:123

           456

原因:如事例1,輸入123回車後,緩衝區記憶體的是123\n,第一次讀入後,緩衝區內只剩餘了\n,當第二次讀入時候,\n是以分隔符存在的,不讀入第二次的是,故緩衝區中是沒有資料存在的,所以需要繼續輸入資料。

例:

輸入:_回車                     “_”代表空格

這種輸入會要求一直輸入,這是因為空格和\n都是分隔符,沒有資料,所以沒辦法讀入。同樣直接輸入回車也是一直要求輸入

程式碼:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%c",s);

printf("%d\n",*s);

例:

輸入:1234_12回車                     “_”代表空格

輸出:1234

           32(空格的ASCII為32)

原因:對於第一個%s讀入時遇到分隔符“空格”就停止,但是空格還是儲存在緩衝區的。對於%c讀入時候,“空格、\n、TAB”等是正常字元,所以第二次讀入時候讀取緩衝中的第一個字元“空格”,所以輸出的是32.

事例2:

輸入:123回車

輸出:123

           10(\n的ASCII為10)

原因:%s讀入後緩衝中指剩下了\n故第二次以%c讀入時候就讀入了\n,輸出為10.