2012-07-13 171 views
0

一些我認爲這應該工作。爲什麼printf自動將%x%o%d轉換爲十六進制十六進制和十二進制

#include<stdio.h> 
void main(void) 
{ 
    short i; 
    scanf("0x%hi",&i); 
    printf("0x%x\n",i); 
    printf("0%o\n",i); 
    printf("%d\n",i); 
} 

不知爲什麼?任何答案,爲什麼不工作。我認爲這應該自動做到十六進制轉換和至少它應該正確打印小數

32768 
    0x26 
    046 
    38 

是我得到的32768輸入。

+0

'void main(void)'是錯誤的。使用'int main(void)'。如果您的教科書告訴您使用'void main(void)',請索取您的退款。參見[comp.lang.c FAQ](http://c-faq.com/),第11節,從問題11.12a開始。 (注意:說這是「錯誤」是一個輕微的過分簡單化,但現在已經足夠接近了。) – 2012-07-13 20:13:40

+0

你應該得到的是'32768 0x0 00 0'。所以我對你爲什麼得到你引用的結果感興趣。你在使用什麼平臺和編譯器? – 2012-07-13 20:14:58

+0

使用* short * over * int *幾乎沒有任何實際益處。除非有縮短整數的可證明的好處,否則請避免。比特很便宜,錯誤是昂貴的。 – jforberg 2012-07-13 20:16:02

回答

4

short可能是您的平臺上的16位,在這種情況下32768不適合。嘗試使用更大的類型。

演示:http://ideone.com/D0hzP

+0

或者更小的值,比如'32767'。 – 2012-07-13 20:10:31

+0

只是爲了澄清:如果您給scanf一個不適合的數字,它將使變量未定義,並且可能已經充滿了垃圾。檢查scanf和朋友的回報值總是值得的。 – 2012-07-13 20:20:26

0

對不起,我犯了一個愚蠢的錯誤。但是,當你提出一個問題時,它確實有助於並給予勇氣和安慰。

 scanf("%hi",&i); 

刪除0x修正了這個。感謝大家的幫助。

相關問題