2016-12-01 29 views
0

這是我的第一個問題,所以如果我弄錯了,請原諒我。 我對編程非常陌生,遇到了一個問題,我找不到在線解決方案。當使用scanf作爲整數時,如果我的輸入以一個或兩個零開始,在某些情況下它會在其他系統中讀取它(甚至不是二進制)。 例如,0020將變爲160030將變爲24,0100將變成64當前面0時,Scanf讀取錯誤的整數

這似乎與8強國合作,並考慮數字高達8(打字0009將導致其打印0然後9)。

可能有一個我不知道的簡單規則,如果答案很明顯,我很抱歉。預先感謝任何回答的人!

+2

告訴我們代碼 – JerryGoyal

+1

您應該發佈您的代碼示例以幫助我們理解 – cokceken

+0

[此'scanf'(和家庭)參考](http://en.cppreference.com/w/c/io/fscanf)應該有幫助。 –

回答

1

有流行的基地不同的符號(基數爲8,10和16) 。

基地8:也被稱爲八度。當您在輸入號碼前加0時,可以將數字定義爲基數8。所以當你輸入020時,它被認爲是十進制的16

基數10:也稱爲小數。你只需要輸入一個你想輸入的號碼,而不需要任何前導碼0。所以當你輸入20時,它被認爲是20

基數16:也稱爲十六進制。你在前面寫上0x。因此輸入0x20時,它將以十進制形式存儲爲32

如果您正在閱讀使用scanf()與格式說明符的數量%d%i,則讀取一個八進制數,並將其解釋爲整數。

+0

'%d'總是意味着十進制(因此爲「d」),它將忽略前導零並且永遠不會轉換爲基數8. – Dai

+0

@Dai您說得對 –

4

scanf的文檔指出格式字符i ...

i匹配是一個符號整數。下一個指針必須是 指向int的指針。如果以0x或0X開頭的 ,則以16爲基數讀取整數;如果以0開頭,則以8爲底數讀取整數;否則,以10爲底數讀取基地臺數 。只有對應於基數的字符是 。

如果要強制讀取十進制整數然後用格式說明d

d匹配是一個符號十進制整數;下一個指針必須是一個指向int的指針。

所以我想這是你擁有的一切:

int value; 
int n = scanf("%i", &value); 

它改成這樣:

int value; 
int n = scanf("%d", &value);