c語言scanf語句查漏補缺

#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

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