2012-11-20 195 views
1

一個非常簡單的問題。爲什麼scanf在第一個while循環中被跳過。 我已經通過使用getchar()來試用它,結果是一樣的。 getchar被跳過。scanf getchar函數被跳過

如果你們不明白我在說什麼,你可以嘗試編譯它,你們會明白我在問什麼。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct rec{ 
    int num; 
    char pref[16]; 
    float point; 
    struct rec* next; 
}rec; 

void dataInput(float*,char*); 
rec* insertNode(rec*); 

int main(){ 

    int i=1; 
    rec* entr,*pt = NULL; 
    entr = (rec*) malloc(sizeof(rec)); 
    entr->num = i; 
    dataInput(&entr->point,entr->pref); 
    entr->next = NULL; 
    char key; 
    i++; 

    while(1){ 

     printf("Continue ? If YES press 'y',or NO press 'n'\n"); 
     key = getchar(); 
     if(key == 'n')break; 
     else if(key == 'y'){ 
      if(!pt){ 
       pt = insertNode(entr); 
      }else{ 
       pt = insertNode(pt); 
      } 
      dataInput(&pt->point,pt->pref); 
      pt->num = i; 
      i++; 
      continue; 
     }else{ 
      printf("Wrong key! Please Press again! \n"); 
     } 

    } 

    pt = entr; 
    while(pt){ 

     printf("num : %d, pref : %s, point: %.1f\n", 
       pt->num, 
       pt->pref, 
       pt->point); 
     pt = pt->next; 
    } 

    getchar(); 
    getchar(); 
    return 0; 
} 

void dataInput(float* point,char* pref){ 

    printf("Input Point\t : "); 
    scanf("%f",point); 

    printf("Input Pref\t : "); 
    scanf("%s",pref); 
} 

rec* insertNode(rec* current){ 
    rec* newnode = (rec*)malloc(sizeof(rec)); 
    current->next = newnode; 
    newnode->next = NULL; 
    return newnode; 
} 

回答

6

這是因爲scanf會在輸入緩衝區留下'\n'(底線)的象徵。該符號將在while(1)循環的第一次迭代中被getchar消耗。

+0

是的!有用!! if(key =='\ n'){key = getchar(); } 後我添加它。謝謝 – edisonthk

3

getchar()在後續scanf()讀取的輸入緩衝區中留下換行符。

您可以使用在scanf函數使用前導空格解決這個問題:

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

它告訴scanf函數忽略所有空白字符。或者在第一個getchar()之後使用另一個getchar()消耗換行符。

+0

Omg您提出的第二個選項對我來說是* ONLY WORKING OPTION *。我嘗試了近15個類似問題中提到的所有東西。在%c之前添加一個空格不起作用,在%c無效後添加\ n,使用fflush(stdin)不起作用,gets,getchar和scanf都有同樣的問題...呃...你知道這是爲什麼嗎? –

+0

可能是由於任何後續的scanf/fgets調用等。不看代碼就看不出來。但我建議閱讀:http://c-faq.com/stdio/scanfprobs.html並避免scanf()。 –