2013-07-25 20 views
1

我無法給出下面的代碼輸出的正確原因。有誰能夠幫助我。使用%d和字符掃描整數使用%d:意外的結果

int main() 
{ 
    int i; 
    char ch; 
    scanf("%c",&i); 
    scanf("%d",&ch); 
    printf("%d\n%c",i,ch); 
    return 0; 
} 

輸入輸出:

input: 
a 
45 
output: 
0 
- 
+1

你期望輸出是什麼? – taocp

+2

爲什麼你不應該使用'scanf'的一個很好的例子。你告訴函數寫一個'char',並且傳遞一個'int'的地址。你告訴函數寫一個'int',並且你傳遞一個'char'的地址。兩者都是未定義的行爲,所以你可以得到任何東西(包括程序崩潰)。 –

+2

「這是我知道的代碼是錯誤的 - 爲什麼代碼錯誤?」 –

回答

3

您正在閱讀的intchar。假設sizeof(int) != sizeof(char),這將導致scanf超出ch的末尾,導致未定義的後果。

您應該使用%i格式說明符int參數和%cchar參數

int main() 
{ 
    int i; 
    char ch; 
    scanf("%c",&ch); 
    scanf("%d",&i); 
    printf("%d\n%c",i,ch); 
    return 0; 
} 
+0

我明白你說什麼,但\t 當我運行gdb後,第一次scanf()我的值是97但第二次scanf後,它將值更改爲0。我想知道做這些改變的是什麼 – abhishekiiit

+0

@abhishekiiit第二次調用'scanf'會導致'sizeof(int)'(可能> = 4)字節被寫入到一個字節'ch'中。這導致未定義的行爲。據推測,在你的情況下,它寫超出分配給'ch'的內存和''i的內存,覆蓋以前存儲的字節97. – simonc

0

這是Undefined behavior。您正試圖通過告知彈出,推動不同的東西來迷惑編譯器究竟它應該分別在printfscanf聲明中。

+0

當我運行gdb,第一次scanf()後我的值是97但在第二次scanf後,它將值更改爲0.我想知道什麼是正在做這些更改 – abhishekiiit

+0

,因爲我說它是未定義的,沒有人可以準確地說出發生了什麼。請通過我給出的鏈接未定義。 –

+0

請考慮在我的答案中使用的推動和流行這個詞。它肯定會對您的問題提出一些問題。 –

1

不要騙到scanfprintf。沒有什麼比這更好的了。

在這種情況下,您試圖將4個字節填充到1的空格中 - 無論您擠壓多少,這顯然不起作用。你的程序不會崩潰的事實純屬運氣。

+0

我只是試驗:P我想知道哪裏出了問題。我知道這是錯誤的,但我想知道如何將值更改爲0而不是別的。爲什麼GDB在第一次scanf後顯示正確的值,並在第二次scanf後將值更改爲0。 – abhishekiiit

+0

因爲你正在編寫'scanf'的變量的大小。它取得變量的地址,但不是大小 - 大小是從「%d」或「%c」派生的。 –