2012-07-09 40 views
0
#include<stdio.h> 
int main() 
{ 
    int x,y; 
    printf("please input 2 numbers:\n"); 
    scanf("%d,%d",&x,&y); 
    printf("Now the value for x is %d, and value for y is %d",x,y); 
    return 1; 
} 

我輸入兩個數字,並將它們分開,然後事情按預期工作。給scanf單個值,需要兩個行爲奇怪

但是,如果我給一個號碼2345,那麼一個奇怪的結果發生:

現在x的值是3456,和Y值是32767

我想不通爲什麼它是。

+2

你爲什麼要返回'1'?這意味着失敗。 – Jack 2012-07-09 20:43:51

+0

這是未定義的行爲。但是scanf可能正在讀取從堆棧頂部存儲在y中的值。 – jn1kk 2012-07-09 20:44:12

+1

在調用'scanf()'之前''''''''''''和'y'有未定義的值。將它們設置爲'0'或'-1'或任何其他_ known_值,然後查看調用scanf()後會發生什麼。 – 2012-07-09 20:48:37

回答

2

當您致電scanf()時,您必須檢查該函數的返回值以查看它是否成功。在我的系統上,它被記錄爲返回分配的輸入項目的數量。

+3

爲什麼*在你的系統*上?文檔不遵循C標準? – Jack 2012-07-09 20:41:33

+0

@Jack我希望我可以upvote兩次。說真的,你爲什麼要告訴我們你的系統?告訴我們標準說的是什麼。 – anthropomorphic 2012-07-09 20:51:23

+0

我的系統恰好遵循標準,至少在這種情況下。我推薦使用他們自己的*系統進行OP檢查,因爲值32767讓我相信他們*可能會使用16位系統,這可能會遵循不同的(舊的)規則。例如,一些舊的預標準運行時庫會返回'scanf()'接受的*字符數量,而不是轉換的參數數量(是的,這些很難處理)。 – 2012-07-09 21:09:56

1

這個奇怪的值,是記憶垃圾。在C中,所有未初始化的變量(staticextern除外)都指向內存垃圾。 當您使用此變量的值時,會發生任何事情,您有UB。您必須初始化此變量的值並檢查scanf()的返回值。

作爲@邁克爾多斯特在評論中提到,設置xx一些uncomum值(例如,-1)和後scanf()呼叫,檢查他們的價值觀也發生了變化。

+0

未初始化的對象具有不確定的值(C 1999 6.7.8 10)。這不會導致標準定義的未定義行爲。 – 2012-07-09 22:47:52

0

這是因爲你的scanf語句。 通常,scanf函數語句具有這種格式:

scanf("%d %d",&x,&y); //without the commas inside the ""'s 


但是你做出這種格式:

scanf("%d,%d",&x,&y); //with the commas inside the ""'s 


這意味着你需要在兩個輸入端之間的逗號分隔符。


請看下面的試驗

TRIAL1:(注:輸入2345)

Please input 2 numbers: 
2345 
Now the value for x is 2345, and value for y is 134513867. 



TRIAL2:(注:輸入23,45)

Please input 2 numbers: 
23,45 
Now the value for x is 23, and the value for y is 45. 



TRIAL3 :(注意:輸入是23 + 45)

Please input 2 numbers: 
23+45 
Now the value for x is 23, and the value for y is 134513867. 



所以,根據該試驗中,的scanf( 「%d,%d」,&的x,& y)基要求輸入具有逗號分隔符。第一次和第三次試驗的輸出結果是,y變量確實包含垃圾,因爲這些y值保持不變/未初始化。但似乎由於scanf上的第一個%d,x變量得到了正確的值。