我無法給出下面的代碼輸出的正確原因。有誰能夠幫助我。使用%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
-
我無法給出下面的代碼輸出的正確原因。有誰能夠幫助我。使用%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
-
您正在閱讀的int
成char
。假設sizeof(int) != sizeof(char)
,這將導致scanf
超出ch
的末尾,導致未定義的後果。
您應該使用%i
格式說明符int
參數和%c
爲char
參數
int main()
{
int i;
char ch;
scanf("%c",&ch);
scanf("%d",&i);
printf("%d\n%c",i,ch);
return 0;
}
我明白你說什麼,但\t 當我運行gdb後,第一次scanf()我的值是97但第二次scanf後,它將值更改爲0。我想知道做這些改變的是什麼 – abhishekiiit
@abhishekiiit第二次調用'scanf'會導致'sizeof(int)'(可能> = 4)字節被寫入到一個字節'ch'中。這導致未定義的行爲。據推測,在你的情況下,它寫超出分配給'ch'的內存和''i的內存,覆蓋以前存儲的字節97. – simonc
這是Undefined behavior。您正試圖通過告知彈出,推動不同的東西來迷惑編譯器究竟它應該分別在printf
和scanf
聲明中。
當我運行gdb,第一次scanf()後我的值是97但在第二次scanf後,它將值更改爲0.我想知道什麼是正在做這些更改 – abhishekiiit
,因爲我說它是未定義的,沒有人可以準確地說出發生了什麼。請通過我給出的鏈接未定義。 –
請考慮在我的答案中使用的推動和流行這個詞。它肯定會對您的問題提出一些問題。 –
不要騙到scanf
或printf
。沒有什麼比這更好的了。
在這種情況下,您試圖將4個字節填充到1的空格中 - 無論您擠壓多少,這顯然不起作用。你的程序不會崩潰的事實純屬運氣。
我只是試驗:P我想知道哪裏出了問題。我知道這是錯誤的,但我想知道如何將值更改爲0而不是別的。爲什麼GDB在第一次scanf後顯示正確的值,並在第二次scanf後將值更改爲0。 – abhishekiiit
因爲你正在編寫'scanf'的變量的大小。它取得變量的地址,但不是大小 - 大小是從「%d」或「%c」派生的。 –
你期望輸出是什麼? – taocp
爲什麼你不應該使用'scanf'的一個很好的例子。你告訴函數寫一個'char',並且傳遞一個'int'的地址。你告訴函數寫一個'int',並且你傳遞一個'char'的地址。兩者都是未定義的行爲,所以你可以得到任何東西(包括程序崩潰)。 –
「這是我知道的代碼是錯誤的 - 爲什麼代碼錯誤?」 –