2013-02-24 49 views
1

的代碼是這樣的:使用scanf(「%d」,&c)而c是char時會發生什麼?

char c; 
scanf("%d", &c); 

輸入3 ...

我的猜測是,當3輸入,它是作爲int類型;
然後鍵入降級爲char並分配給c;

我在指定者%d中打印c的值,產生3,似乎與預期的一樣;
但打印值c與說明符%c在終端上產生一個空白;這是一個問題...(1);
測試更多我還聲明變量chchar類型和初始化它像這樣:

char ch = 1; 

和測試是這樣的:

(i&j)? printf("yes") : printf("no"); 

,其結果是「否」
我打印出的值爲i&j,它是0
但是1&3應該是1?這是另一個問題....(2);
我的問題是(1)和(2)

回答

0

我看不到變量j那裏。所以i&j將是0.是的,如果i == 1j == 3然後i & j == 1

+0

對不起,我的問題第j是CH上述聲明...只是錯字 – 2013-02-24 11:21:26

0

(i & j)? printf(「yes」):printf(「no」);
語句給出的結果是,對於i = 1和j = 3。

對於(1)問題,ASCII 3是針對不可打印的STX字符。

4

你實際上調用了未定義的行爲。

通過使用格式字符串%d,你告訴scanf期望的int*作爲參數,你傳遞一個指針給一個字符。請記住,scanf沒有關於通過它的更多類型信息,而不是您在格式字符串中輸入的內容。

這將導致scanf試圖在一個指向char尺寸預約,潛在地(並且對於大多數體系結構)寫入出界的地址寫一個int尺寸值到存儲器。

調用UB後,所有投注都將在您的進一步計算中關閉。

+0

所以沒有類型PRO /降級發生,但overwritting? – 2013-02-24 11:33:42

+0

並說是這樣;但不管我的系統是大/小端問題?重寫什麼時候會發生,如用4字節整數的最小字節覆蓋1字節?如果是這樣,ch(1)和c(3)應該是1? – 2013-02-24 11:34:04

+0

@ J.C。是的,它只會無情地在該地址覆蓋內存,存在什麼樣的發生無類適配。從邏輯上講,我說你應該看到的價值'3'在小端機器上的字符,但UB的結果是相當清楚的,一旦你做到了,你可以不依賴於任何一個預測的工作方式了。 – 2013-02-24 11:42:40

1

假設scanf()函數不是一個可變參數的功能,而是一個普通的普通函數採用指針到INT作爲第二個參數:

int noscanf(char *format, int *ptr) 
{ 
    *ptr = 42; 
    return 1; 
} 

int main(void) 
{ 
    char ch; 
    int rc; 

     // This should *at least* give a warning ... 
    rc = noscanf("Haha!" , &ch); 

    return 0; 
} 

現在,scanf()的一個可變參數功能。對於scanf()的唯一的方式來確定(指針)的類型參數是通過檢查格式字符串。而%d表示:下一個參數應該是一個指向int的指針。因此scanf函數可以愉快地寫sizeof(int)字節* PTR。

相關問題