2014-01-22 157 views
0

我知道使用scanffgets的區別和優勢/劣勢。「scanf with printf」vs「fgets with printf」

我不明白printf和這兩個C標準函數之間的關係。

我有這個簡單的代碼:

void print_choice(char * list, char * choice) 
{ 
    /* check parameters */ 
    if(!list || !choice) 
    return; 

    printf("list of users: %s\n", list); 
    printf("Choice -- ? "); 

    /* scanf("%s", &choice); */ 
    /* fgets(choice, 20, stdin); */ 

} 


int main() 
{ 
    char choice[20]; 
    char * list = "marco:dario:roberto:franco"; 

    print_choice(list, choice); 
    printf("choice = %s\n", choice); 

    return 0; 
} 

如果我使用fgets的printf正確打印在標準輸出結果;

如果我使用scanf,printf`不會在stdout上打印任何內容。

爲什麼會這樣?

+0

您需要fflush((stdout)在printf之後使用 – cup

+0

作爲_scanf(「%s」,選擇); _ << - Notice dropped'&' –

回答

3

您使用的scanf("%s", &choice);當它期望char *時通過char **scanf()

刪除&

如果你的編譯器沒有抱怨,你要麼沒有打開足夠的警告,要麼你需要更好的編譯器。

+0

與「如果您的編譯器不抱怨」 – chux

+0

Oh sh .. !!對不起,這個愚蠢的錯誤!!謝謝! – Kyrol

1

變化

scanf("%s", &choice); 

scanf("%s", choice); 
1

,你必須使用

scanf("%s", choice); 

,而不是

scanf("%s", &choice); 
0

scanf("%s", &choice);更改爲scanf("%s", choice);將導致scanf和fgets顯示幾乎相似的行爲。

scanf需要地址作爲參數。它繼續並根據提供的格式說明符轉換它之後存儲stdin的輸入。這裏的格式說明符是%s,因此它會嘗試將輸入存儲在選擇地址指向的地址處。這裏你需要的是選擇數組從何處開始的地址,在這種情況下本身就是選擇。