2010-07-15 28 views
4

我創建了一個非常簡單的程序,它帶有一個菜單, 取值,然後將它記憶到 局部變量值中,最後用 第二個選項顯示該值。爲什麼%hd在scanf中是必需的?

我的問題是: 爲什麼程序只有在將「h」 添加到scanf參數時才起作用? 換句話說:scanf()和我的本地int值變量之間有什麼樣的關係 ?

謝謝!

p.S. (我用的開發 - C++(GCC)進行編譯。 與Visual Studio它的工作原理)

#include <stdio.h> 

main() { 

    int value = 0; 
    short choice = 0; 

    do { 
     printf("\nYour Choice ---> "); 
     scanf("%d", &choice); /* replace with "%hd" and it works */ 

     switch (choice) { 
      case 1: 
       printf("\nEnter a volue to store "); 
       scanf("%d", &value); 
       getchar();    
       printf("\nValue: %d", value); 
       break; 
      case 2: 
       printf("\nValue: %d", value);    
       break; 
     } 

    } while (choice < 3); 

    getchar(); 
} 
+0

很抱歉的壞文本格式 – Mario 2010-07-15 16:28:31

回答

11

對於scanf,「h」修飾符表示它正在讀取一個短整數,其中的變量choice恰好是。所以「%hd」對於僅寫入兩個字節(在大多數機器上)而不是「%d」寫入的4個字節是必需的。

欲瞭解更多信息,請參閱本reference page on scanf

+2

Ok Thanks for for reply – Mario 2010-07-15 16:35:56

2

變量choiceshort所以這就是爲什麼你需要在scanf的%h符讀入它的類型(在事實上你不需要這裏的d)。 int類型只需要%d。請參閱關於轉換的說明here

+0

是的,我知道,但問題是爲什麼,因爲這個「H 「缺少,我的程序不會將值存儲到int值變量中? – Mario 2010-07-15 16:31:16

+0

@Mario:因爲scanf將「%hd」定義爲「讀取兩個字節(在32位平臺上)並將其放入短整型數據類型中。 – Randolpho 2010-07-15 16:33:06

0

%d用於閱讀int,不是簡短的。你的代碼從來沒有真正「起作用」 - 看起來在這種情況下,你沒有注意到你想要的和你得到的未定義行爲之間的區別。

1

它看起來像你的問題是,choiceshort,這是(一般),2個字節長,而%d期待一個整數,它是(一般)4個字節長......所以scanf則會覆蓋choice上後無論發生什麼事疊加。

1

choiceshort和%d指定了int

當您指定%d時,scanf必須假定關聯的參數是指向int大小的內存塊的指針,並且將向其寫入int。當發生這種情況時,它可能會寫入數據臨近但不是choice的一部分,結果是不確定的,可能並不好!如果它在一個編譯器中工作,而不是另一個,那簡直就是undefined行爲的本質!

在GCC -Wformat應該給你一個警告,當你犯這個錯誤。

0

scanf輸入short類型變量的修飾符是%hd。因此你需要指定正確的修飾符。

scanf("%d",&integer); // For integer type 
scanf("%hd",&short_int); // For short type 

因此它不起作用。

0

根據數字填充,字節順序和其他此類問題,您可能將輸入值的上部或下部存儲爲選項;您將輸入值的其餘部分存儲到內存中,可能會或可能不會用於其他任何內容。

相關問題