2012-11-20 6 views
1

아주 간단한 질문입니다. scanf가 첫 번째 while 루프에서 건너 뛴 이유는 무엇입니까? getchar()을 사용하여 시도한 결과가 동일합니다. getchar를 건너 뜁니다.scanf getchar 함수를 건너 뛰었습니다.

너희들이 내가 말하는 것에 대해 이해할 수 없다면 그것을 컴파일 해 볼 수 있고 너희들은 내가 무엇을 요구하는지 이해할 것이다. scanf 입력 버퍼에 '\n' (endline) 심볼을두고 있기 때문에

#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

그것은이다. 이 while(1) 루프의 첫 번째 반복시이 기호는 getchar에 의해 소비됩니다.

+0

예! 그것은 작동! if (key == '\ n') {key = getchar(); } 내가 추가 한 후 . 고맙습니다 – edisonthk

3

getchar()은 후속 scanf()가 읽는 입력 버퍼에 줄 바꿈 문자를 남겨 둡니다.

당신은 scanf와에서 주도적 공간을 사용하여이 문제를 해결 사용할 수 있습니다

모든 공백 문자를 무시하기는 scanf를 알려줍니다
scanf(" %c ...", &c,..); 

. 또는 첫 번째 getchar() 바로 다음에 또 다른 getchar()을 사용하여 개행을 사용합니다.

+0

Omg이 제안한 두 번째 옵션은 * 나를위한 유일한 작업 옵션 *입니다. 나는 거의 비슷한 질문에 언급 된 모든 것을 시도했다. % c가 작동하지 않기 전에 공간을 추가하고 % c가 작동하지 않으면 \ n을 추가하고 fflush (stdin)를 사용하여 작동하지 않고 getchar 및 scanf가 모두 같은 문제를 가지고 있습니다 ... Ugh 이게 왜 있는지 아십니까? –

+0

이후의 scanf/fgets 호출 등으로 인해 발생할 수 있습니다. 코드를 보지 않고도 알 수 없습니다. 그러나 나는 이것을 읽는 것이 좋습니다 : http://c-faq.com/stdio/scanfprobs.html 그리고 scanf()를 피하십시오. –

관련 문제