#include <stdio.h>
int main(void)
{
int i;
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}
在 VC++ 6.0 中的輸出結果是:
a
i = -858993460
輸出 –858993460 表示變量未初始化。爲什麼輸入 a,變量 i 卻顯示未初始化呢?
在 scanf 中,從鍵盤輸入的一切數據,不管是數字、字母,還是空格、回車、Tab 等字符,都會被當作數據存入緩衝區。存儲的順序是先輸入的排前面,後輸入的依次往後排。按回車鍵的時候 scanf 開始進入緩衝區取數據,從前往後依次取。
但 scanf 中 %d 只識別“十進制整數”。對 %d 而言,空格、回車、Tab 鍵都是區分數據與數據的分隔符。當 scanf 進入緩衝區中取數據的時候,如果 %d 遇到空格、回車、Tab 鍵,那麼它並不取用,而是跳過繼續往後取後面的數據,直到取到“十進制整數”爲止。對於被跳過和取出的數據,系統會將它從緩衝區中釋放掉。未被跳過或取出的數據,系統會將它一直放在緩衝區中,直到下一個 scanf 來獲取。
但是如果 %d 遇到字母,那麼它不會跳過也不會取用,而是直接從緩衝區跳出。所以上面這個程序,雖然 scanf 進入緩衝區了,但用戶輸入的是字母 a,所以它什麼都沒取到就出來了,而變量 i 沒有值,即未初始化,所以輸出就是 –858993460。
但如果將 %d 換成 %c,那麼任何數據都會被當作一個字符,不管是數字還是空格、回車、Tab 鍵它都會取回。
不但如此,前面講過,你從鍵盤輸入 123,這個不是數字 123,而是字符 '1'、字符 '2' 和字符 '3',它們依次排列在緩衝區中。因爲每個字符變量 char 只能放一個字符。所以輸入“123”之後按回車,scanf 開始進入緩衝區,按照次序,先取字符 '1',如果還要取就再取字符 '2',以此類推。
如果都取完了還有 scanf 要取數據,那麼用戶就需要再輸入。先寫一個程序看一下:
#include<stdio.h>
int main(void)
{
char i, j, k;
scanf("%c%c%c", &i, &j, &k);
printf("i = %c, j = %c, k = %c\n", i, j, k);
return 0;
}
在 VC++ 6.0 中的輸出結果是:
123
i = 1, j = 2, k = 3