2009-09-08 2 views
13

나는 C 언어를 배우고 있는데, "getchar()"을 사용하여 명령 창을 멈추었으므로 연습 문제를 볼 수는 있지만 작동하지 않습니다. 를 heres 샘플 :getchar()이 scanf() 후에 enter 키를 누를 때까지 기다리지 않는 이유는 무엇입니까?

  1. 옵션 1.
  2. 옵션 2.
  3. 옵션 3.
  4. 종료 :

    #include <stdio.h> 
    
    int main() 
    { 
        int value; 
        printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
        scanf("%d", &value); 
        switch (value) 
        { 
         case 1: 
          printf("you selected the option 1."); 
          break; 
         case 2: 
          printf("you selected the option 2."); 
          break; 
         case 3: 
          printf("you selected the option 3."); 
          break; 
         case 4: 
          printf("goodbye"); 
          break; 
         default: 
          printf("thats not an option"); 
          break; 
        } 
        getchar(); 
        return 0; 
    } 
    

    이 출력입니다. 3.453의

    을 눌러 계속하려면 아무 키 : 1.

    프로세스가 0 (0x0으로) 실행 시간을 반환하는 옵션을 선택한 1

    :

이 옵션을 확인합니다.

왜 "getchar()"입력을 기다리지 않습니까?

+0

는 http://stackoverflow.com/questions/1384073/problem-with-flushing-input-stream-c/1384089를 참조하십시오. –

답변

2

getchar가 1 후에 입력 한 캐리지 리턴을 얻을 수 있습니까?

+0

예, getchar()은 입력을 종료하는 개행을 가져오고 있으므로 데이터가 이미 버퍼에 있으므로 오래 기다리지 않습니다. –

+0

그게 잘못이라면. 나는 fflush 대답을 좋아하고 그것을 시도하고있다. –

+1

물론 그 fflush 남자들은 rright했다. –

21

귀하의 scanf는 숫자 만 먹었지 만 뒤 따르는 줄 바꿈은 계산하지 않았습니다. % d 다음에 줄 바꿈 또는 공백을 넣으면 반대되는 문제가 발생합니다. 너무 멀리 읽습니다.

사람들이 scanf를 좋아하지 않는 이유입니다.

실제 줄을 읽고 (fgets(3) 사용) sscanf()을 사용하여 문자열을 검색하는 것이 좋습니다.

-9

프로그램이 작동하려면 fflush (stdin)를 호출하여 getchar()을 호출하기 전에 입력 스트림을 "플러시"해야합니다. 이것이하는 일은 키보드에 숫자와 리턴 키를 입력 할 때 입력 버퍼가 '1'과 '\ n'과 같은 두 문자를 모두 가져오고 scanf에 대한 호출이 '1'이되므로 ' \ n '은 입력 버퍼에 남아 있습니다. getchar을 호출하면 남은 '\ n'이 "gettin"됩니다. 입력을 플러시하면 모든 버퍼가 삭제됩니다.

+3

'fflush (stdin)'은 _undefined behavior_입니다. 하지 마. –

+0

그러면 어떻게해야합니까? 정말 새롭다. 첫 번째 프로그래밍 언어로 파이썬에서 온 것이므로 메모리 관리에 대한 모든 것이 나에게 중국인이다. –

+1

와우 .. 나는 몰랐다. 단지 약간의 연구를했고이 설명을 http : // 발견했다. www.gidnetwork.com/b-57.html – nairdaen

2

getchar가()는 scanf와의 키보드에서 \ n을 읽고있다 - 더 많은 정보

1

에 대한 here을 볼 나는 당신에게이 "1"을 입력 한 후 입력 입력을 생각합니다. getchar()에서 허용됩니다. 따라서 getchar()을 원래의 문자 다음에 추가하여 문제를 간단하게 해결할 수 있습니다 (return 0; 직전).

**이 테스트를 거쳤습니다.

8

우선 이 아닌은 입력 스트림을 지우는 데 fflush()를 사용합니다. 동작은 정의되지 않았습니다.

7.19.5.2.2 스트림이 가장 최근의 연산이 입력되지 않은 출력 스트림 또는 업데이트 스트림을 가리키면 fflush 함수는 해당 스트림에 대해 작성되지 않은 데이터를 호스트 환경에 전달하여 파일에 기록합니다. 그렇지 않은 경우 동작은 입니다.

문제 후행 개행은 "%의 D '전환 지정자에 의해 소비되지 않는 것으로하고, 그래서 그것은 getchar() 의해 즉시 픽업되어있다. 가장 좋은 방법은 없지만 일반적으로 전체 줄을 텍스트 (또는 scanf() 크기가 지정된 "% s"변환 지정자와 함께 사용)로 읽는 것입니다. 그러면 줄 바꿈을 사용하고 대상으로 변환됩니다 sscanf() 또는 strtol() 또는 strtod()을 사용하는 데이터 유형

-2
#include <stdio.h> 
#include<conio.h> 
void main() 
{ 
    int value; 
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
    scanf("%d", &value); 
    switch (value) 
    { 
     case 1: 
      printf("you selected the option 1."); 
      break; 
     case 2: 
      printf("you selected the option 2."); 
      break; 
     case 3: 
      printf("you selected the option 3."); 
      break; 
     case 4: 
      printf("goodbye"); 
      break; 
     default: 
      printf("thats not an option"); 
      break; 
    } 
    getch(); 
} 
+0

그럼 대답은'getch'를 대신 사용하는 것입니까? 그 사실을 분명히 할 수 있을까요? –

2

당신은 내가

char ch;

, 숯불을 정의하고 그냥 캐리지 리턴을 스캔이, 주위 얻을 방법을 캐리지 리턴 것이다 얻고있다 (당신의 getch 전에()는 다음 입력) scanf("%c",&ch); getchar();

이 방법으로 작동해야합니다. 가장 효율적인 방법은 아니지만 저에게 좋습니다.

1

이미 언급했듯이 사용자 입력을 읽은 후 scanf는 \ n 뒤에 있습니다.

소울 톤 : scanf 다음에 getchar()을 추가하십시오.

이는 scanf 결핍을 보완합니다.

int value; 
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
scanf("%d", &value); 
getchar(); 
switch (value)