2010-12-05 5 views
1

다음은 나에게 문제를 일으키는 코드의 조각입니다 :개미는 fgets() 후에 버퍼에 남아 있습니까?

#define MAX_NAME_LEN 64 

char choice; 
char name[MAX_NAME_LEN]; 
printf("Name: "); 
fgets(name, MAX_NAME_LEN, stdin); 
choice = getchar(); 

나는 이름을 입력하고 Enter 키를 누릅니다 후, getchar가() 다음 문자를 기다리는 대신뿐만 아니라 줄 바꿈을 캡처합니다. getchar()이 이름을 입력 한 후 예상대로 문자를 기다릴 수 있도록 가능한 한 다른 getchar()과 같은 해킹이없는 코드를 수정하려면 어떻게해야합니까?

+1

'MAX_NAME_LEN'에 하나를 추가하면 안됩니다.'fgets()'는'n-1' 문자 만 읽고 종료 NUL은 하나 남겨 둡니다. – Alnitak

+0

아, 맞습니다. 수정 해줘서 고마워. – linkmaster03

답변

0

Mac OS X 시스템에서 GCC를 사용하여 문제를 재현 할 수 없습니다. ENTER을 누르면 CRLF이 모두 생성되는 Windows 시스템을 사용하고 있습니까? 어떤 경우

getchar() 보통 때문에 대부분의 시스템 stdin 기본적으로 하나의 키를 누른 후에 즉시 반환하지 않습니다 라인 터미널 서브 시스템이 될 때까지 사용자 프로세스에 모든 문자를 제공하지 않을 것을 의미 버퍼링이다 ENTER을 누릅니다.

getchar()getch()과 같은 이전 DOS <conio.h> 기능을 대신 할 수 없습니다.

주위를 둘러 보는 방법은 현재 사용중인 O/S에 따라 다릅니다.

+0

아니, 나는 리눅스에있다. – linkmaster03

+0

fgets는 항상 새 행을 읽습니다 (http://linux.die.net/man/3/fgets). '개행 문자가 읽히면 버퍼에 저장됩니다. ' –

+1

그래, 나는 달리 말하지 않았다. 명확하지 않은 것은 왜 단지 한 번만 입력하면 그의'fgets()'와'getchar()'호출이 완료되는 것인가하는 것입니다. 그것은 나를 위해서만 효과가 있습니다. – Alnitak