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.