2017-04-21 1 views
-4

어떻게 printf ("prompt :")가 즉시 인쇄되지 않습니까? 나는 fflush (stdout)을 시도하고 \ n하지만 그 중 아무 것도 작동하지 않았다. 그것은 단지 인쇄 때 인쇄 "를 참조하십시오"C 프로그램의 혼란스러운 동작, printf

int main() { 
    char line[1025]; 
    char command[80], argument[80]; 
    char argv[3][80]; 
    int i, pid; 
    *(argv[2]) = '\0'; 

    while((fgets(line, 1024, stdin))) { 
     printf("prompt:"); 

     line[1024] = '\0'; 
     sscanf(line, " %s %s ", command, argument); 

     if(strcmp(command, "exit") == 0 || strcmp(command, "hastalavista") == 
      0) { 
      printf("See you\n"); 
      exit(0); 
     } 
    } 
    return 0; 
    } 

답변

5

표준 I/O (<stdio.h>에서 즉, 기능) 버퍼 (그리고 종종 특히 stdout를 들어, 라인 버퍼).

당신은

BTW, 당신이printf("prompt:"); 전에 fgets을 요구하고있다 (예를 들어, fflush(stdout);를 호출하여)로 세척해야합니다. 그것은 틀리게 보인다. 나는 의 앞에의 앞에 fgets를 건의한다. 물론

, 모든 경고 & 디버그 정보를 컴파일해야 POSIX 시스템에서, 지난 디버거 (예를 들어, gdb)

를 사용하고 (예를 들어, gcc -Wall -gGCC를 사용하는 경우) 당신은 getline(3)를 사용할 수 있습니다. 리눅스 시스템에서는 심지어 readline(3)을 사용할 수 있습니다.

sscanf을 사용하면 반품 수를 더 잘 테스트 할 수 있습니다 (%n을 사용하는 것이 좋습니다).

터미널 (예 : POSIX 시스템 이상)에 대해 더 자세히 읽어야합니다. tty demystified 페이지 및 약 line discipline입니다. 참조 : termios(3) & i satty(3).

3

while((fgets(line, 1024, stdin))) : - 이것은 stdin에서 읽고 line에 내용을 넣었다는 것을 의미합니다. fgets은 EOF 또는 개행 문자를받을 때까지 반환되지 않습니다. 즉, "Enter"키를 누를 때까지 을 기다립니다.

키를 누르지 않으면 "프롬프트"가 인쇄되지 않습니다. 그래서 지연되었습니다! 당신이 line에 저장됩니다 입력 누르기 전에 입력 무엇이든

그리고, (최대 1024 바이트)

+1

나는 fgets' 그것의 가장 첫 번째 1024 바이트의 전체 라인 및 저장을 기다리는'있다고 생각합니다. –

+0

@BasileStarynkevitch'fgets'의 두 번째 매개 변수는 "읽을 최대 문자 수"를 지정합니다. 1024 바이트가 수신되면 읽기를 중지합니다. – Swanand

+2

줄 바꾸기가 발생하면 읽기를 중지합니다. 또한 반환되는 키가 1024 자보다 많든 적은 지 여부에 관계없이 반환 키를 눌러 프로그램에 데이터를 보낼 때까지 아무 것도 반환하지 않습니다. 일부 시스템에서는 터미널 드라이버가 한 줄에 1024자를 허용하지 않습니다. 한계는 256 바이트 정도로 작습니다. –