2012-05-31 60 views
1

有人能告訴我爲什麼case 1中的獲取被完全忽略?gets()裏面的開關被忽略

// #define M 50 is at the top 

    char product[M] = {0}; 
    int choice = -1; 

    printf("Command: "); 
    scanf("%d", &choice); 

    switch(choice){ 

     case 0: 
      break; 

     case 1: 
      printf("Product: "); 
      gets(product); 
      insert_product(warehouse, price, product); 
      break; 

     case 2: 
      // print_all(); 
      break; 

     default: 
      printf("Scelta non valida\n"); 
      break; 

    } 
+3

?這個API非常危險,是一個等待發生的漏洞。 – JaredPar

+0

您沒有提供任何關於「選擇」的信息。它是什麼?你如何設定它的價值? – Tudor

+0

@JaredPar因爲有人要求我和安全現在不是問題,因爲我正在學習C.我知道我應該使用fgets而不是:) – siannone

回答

5

get可能被上一個輸入的結尾字符忽略。嘗試在get之前添加getchar()以查看是否是問題。

+0

謝謝!這就是訣竅:) – siannone

1

的問題是,閱讀choice當你換行輸入:

scanf("%d", &choice); 

被作爲輸入下一個gets(product);,所以它讀取一個空字符串。嘗試scanf後添加人工getchar吸收換行符:

scanf("%d", &choice); 
getchar(); 

現在應該工作。

1

首先,最重要的一點...

永遠永遠永遠永遠永遠永遠使用gets。永遠。即使是練習代碼。即使別人告訴你。這就像電影Highlander II;只是假裝它從來沒有存在過。它在C99中被棄用,並已從C2011中完全刪除。不要使用它。不要試圖聲稱這只是練習代碼而使用它。如果有人要求您使用它,請推回來告訴他們您將使用fgets。如果他們給你悲傷,請將他們送給我,我會理順他們。必要時用棒球棒。

好了,現在我已經生龍活虎起來......

gets正在加快從您以前scanf呼叫進入輸入換行符。您有幾種選擇:

  1. 使用另一個scanf呼叫,而不是gets,這次與%s轉換符(帶有字段寬度一起);不像gets,它會跳過任何主要的換行符;

  2. 致電getchar()(或同等學歷)在致電gets之前消耗換行符;

  3. ,而不是讀choice作爲使用scanf整數,使用fgets它讀成文本並將其轉換爲使用strtol整數。

選項3是最好的國際海事組織。將呼叫混合到scanf/fscanffgets通常是胃灼熱的祕方,正是由於尾隨的換行問題。更好地堅持一個或另一個一切。使用fgets以文本形式讀取所有內容的優點是,它使輸入驗證更加容易,特別是對於數字輸入。你爲什麼要使用`gets`

0

//的#define米50是在頂部

char product[M] = {0}; 
int choice = -1; 

printf("Command: "); 
scanf("%d", &choice); 

switch(choice){ 

    case 0: 
     break; 

    case 1: 
     printf("Product: "); 
     getchar(); 
     gets(product); 
     insert_product(warehouse, price, product); 
     break; 

    case 2: 
     // print_all(); 
     break; 

    default: 
     printf("Scelta non valida\n"); 
     break; 

}