2014-10-17 106 views
0

這是我的主要功能..爲什麼我的第二個「scanf」被跳過?

printf("How many marking components in the course? "); 
    scanf("%d", &numberOfComponents); 
    for (int i=0; i<numberOfComponents; i++){ 

      char c[MAX_STR]; 
      printf("enter next component name: "); 
      fgets(c, sizeof(c), stdin); 
      scanf(c, " %c", &c); 


      Component comp; 

      initComp(&comp, c); 
      class.comps[i] = comp; 

      } 

    printf("How many marking schemes? "); 
    scanf(" %d", &numberOfSchemes); 

我已經試過白色的空間,但它仍然存在

+5

什麼是'scanf(c,「%c」,&c);'應該是什麼意思?你用這個'scanf'調用你想要做什麼? – AnT 2014-10-17 01:07:28

回答

0

混合fgets()scanf()經常造成問題。

scanf("%d"...留下任何下面的空格,如'\n'stdinfgets()得到。 scanf(c, " %c", &c);(這可能意味着是scanf(" %c", c);sscanf(c, " %c", c);)後會發生同樣的情況。

scanf("%d", &numberOfComponents); 
... 
fgets(c, sizeof(c), stdin); 

推薦使用僅fgets()獲取用戶輸入並使用sscanf()strtol()等來解析該輸入。

fgets(c, sizeof(c), stdin); 
sscanf(c, "%d", &numberOfComponents); 

.... 

fgets(c, sizeof(c), stdin); 
// I do not think you need the following line of code. 
// Besides it is UB as it attempts to scan and save into the same buffer. 
// sscanf(c, "%c", &c); 

fgets(), sscanf()省略結果的錯誤檢查,但還是好做的。

+0

通過「下面的代碼行」你的意思是f得到了嗎?或者scanf? – Bauer 2014-10-17 01:40:58

+0

@Nolan Hodge'sscanf(c,「%c」,&c);' – chux 2014-10-17 03:21:49

1

您應該測試您的輸入操作是否有效;當你不這樣做時,事情就會變得不合時宜。

這次調用scanf()

scanf(c, " %c", c); 

應該(在chux診斷他answer)進行不同的寫的,但我認爲它應該更像:

char filler; 
if (scanf(" %c", &filler) != 1) 
    …report problem… 

原來的版本使用只讀作爲格式字符串的行,幾乎肯定會失敗匹配第二個輸入。如果您只使用scanf(" %c", c)這是最簡單的編輯,那麼用下一個非空字符覆蓋輸入行的第一個字符。

這就是爲什麼您要讓用戶在組件名稱後輸入額外數據的問題。他們必須輸入一些東西。在下一個fgets()上,代碼將在第一個字符之後讀到下一個換行符。所以,如果你鍵入:

component-1 
component-2 

第一fgets()會讀component-1和換行;修改後的scanf()會將component-2c讀爲c[0],然後接下來的fgets()將在下一次迭代中將omponent-2加上換行符加上c

你可以看到更多的是怎麼回事的加入代碼來打印你讀,你讀它:

printf("Line 1: [[%s]]\n", c); // after the fgets() 
printf("Line 2: [[%s]]\n", c); // after the scanf() 

這是最基本的調試技術之一;迴應你讀過的內容,以確保程序獲得了你認爲它的數據。