2013-10-20 28 views
1

我使用scanf("%llu%c", &myUnsignedLong, &checkerNewLine)來驗證數字>0 && <2^64,其中checkerNewLine用於清除緩衝區,如果有人試圖插入一個字母(while (getchar() != '\n');)。爲什麼scanf llu不驗證%llu?

但是,如果我嘗試插入一個負數,如-541231,scanf成功並返回2(作爲參數匹配的數量)。很明顯,myUnsignedLong中存儲的號碼是2^64-541231,但這不是我的意圖。

任何簡單的方法來解決這個問題?非常感謝

+0

那麼你的意圖是什麼? – haccks

+2

@haccks據推測,OP預計'scanf(「%llu」)將無法解析負數,並會返回一個錯誤。 – pburka

回答

4

從規範(7.9.16.2):

u匹配任選符號十進制整數,其格式是相同的預期strtoul函數的與所述值的目標序列10爲基本參數。相應的參數應該是一個指向無符號整數的指針。

請注意,輸入可選擇簽名。這解釋了爲什麼代碼的行爲如此。

但是,我不能提供任何好的解釋,爲什麼它是這樣指定的。既然你不能以一種明確的方式在一個無符號變量中存儲一個負值,我懷疑這實際上可能會調用未定義的行爲。

+0

很可能它會調用UB。 – haccks

+0

所以我無法以任何方式驗證範圍內的值:每次插入一個尊重MIN rodi