2013-07-21 53 views
-2

在下面的代碼,將字符串輸入到一個int變量中?

#include<stdio.h> 
int main() 
{ 
    int i=5; 
    scanf("%s", &i); 
    printf("%d\n", i); 
    return 0; 
} 

予取存儲在i地址輸入字符串。當我嘗試打印變量i時,我得到一些數字。

例子:

輸入:
hello
OUTPUT:
1819043176

什麼號碼,這是和究竟是怎麼回事?

+3

發生了什麼被稱爲[未定義行爲](http://en.wikipedia.org/wiki/Undefined_behavior)。 –

回答

4

該程序將從用戶讀取的字符串寫入變量i佔用的內存中並通過它。由於這是未定義的行爲,任何事情都可能發生。

什麼是實際發生的事情是,你的機器int上是4個char S上的大小,字符「地獄」,當轉換成ASCII碼,並解釋爲在CPU中的字節順序號碼,原來是數1819043176.字符串的其餘部分,字母o和終止nul字符,已經超過了我存儲在你的機器上的地方。那麼,什麼scanf確實是這樣的:

h e l l o \0 
|68 65 6c 6c|6f 00 ... 
|   i|memory past i 

你似乎有點端機器上運行這一點,所以,當字節68 65 6c 6c被存儲到一個int它解釋爲數字0x6c6c6568,或十進制1819043176

如果int的大小不同,或者機器使用了另一個字符集(如EBCDIC而不是ASCII),或者CPU使用了big-endian字節順序,或者程序在內存寫入綁定的環境中運行 - 檢查,你會得到不同的結果或程序崩潰。總之,未定義的行爲。

相關問題