2011-04-07 3 views
3

아래 코드는 supposed이며 단계별로 사용자에게 정보를 제공합니다. 그러나 현재는 정보를 기다리고 다음은 제공된 내용과 프롬프트를 표시합니다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까? 감사.메시지 확인 및 저장에 대한 도움말

contacts.h 파일

struct contacts { 
    int phone_number; 
    char first_name[11], last_name[11]; 
}; 

rolodex.c 파일

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

int main(int argc, char* argv[]) { 
    struct contacts* c = (struct contacts*) malloc(sizeof(struct contacts)); 
    if (c == 0) { 
     return 1; 
    } 
    set_first_name(c); 
    set_last_name(c); 
    set_phone_number(c); 
    display_contact(c); 
} 

int set_first_name(struct contacts* c) { 
    puts("\nWhat is your first name? "); 
    gets(c->first_name); 
    return 0; 
} 

int set_last_name(struct contacts* c) { 
    puts("\nWhat is your last name? "); 
    gets(c->last_name); 
    return 0; 
} 

int set_phone_number(struct contacts* c) { 
    printf("\nWhat is your phone number? "); 
    scanf(" %d", &c->phone_number); 
    return 0; 
} 

int display_contact(struct contacts* c) { 
    printf("\nName: %s %s Number: %d", c->first_name, c->last_name, c->phone_number); 
    return 0; 
} 
+2

'gets()'를 사용하지 마십시오. 안전하지 않으며 안전하지 못합니다. 'fgets()'대신'fgets (c-> last_mame, sizeof c-> last_name, stdin); ' – pmg

+0

+1'을 사용하라. – pmg

답변

7

표준 출력 스트림은 라인 기본적으로 버퍼링된다. 즉, 전체 문장보다 짧은 출력은 다른 문장으로 계속 실행되기 전에는 볼 수 없다는 것을 의미합니다.

출력을 '\n' 또는 fflush(stdout)으로 끝내십시오. EDITED


: 이미 광고 분투를 지원하지 않는 '\n'

int set_phone_number(struct contacts* c) { 
    printf("\nWhat is your phone number?\n"); /* \n at end of output */ 
    scanf(" %d", &c->phone_number); 
    return 0; 
} 

또는

int set_phone_number(struct contacts* c) { 
    printf("\nWhat is your phone number? "); 
    fflush(stdout);       /* force output */ 
    scanf(" %d", &c->phone_number); 
    return 0; 
} 
+0

'get '에 대한 헤드 업과 std 출력 스트림이 버퍼링된다는 설명을 주셔서 감사합니다. 나는 당신이 위에서 제안한 두 가지 방법 모두를 시도했다. ('\ n'을 써서 줄을 끝내고 출력을 내 렸을 때) 후자의 방법 만이 효과가 있었다. 왜 그런가? – DanMark

+0

둘 다 작동해야합니다. 나는 왜'fflush (stdout)'이 작동하고'printf()'를''\ n ''으로 끝내는 지 모르겠다. 하드웨어, OS, 컴파일러, 컴파일 옵션은 무엇입니까? 어쩌면 당신의 시스템에서,'stdout'은 기본적으로 완전히 버퍼링되어 있습니다. (표준에 의해 불법입니다) ... – pmg

+0

vista에서'msys (mingw32)'를 사용하고 있고 컴파일 된 cmd는입니다. :'gcc -o rolodex rolodex.c'. – DanMark

0

윈도우와 출력 단부 puts 사용 이전 예. 기본적으로 스트림은 콘솔 창과 직렬 회선에서 버퍼링되지 않으며 다른 곳에서는 완전히 버퍼링됩니다. 수동으로 플러시하는 대신 setvbuf()를 사용하여 버퍼링을 비활성화 할 수 있습니다.