2012-09-09 2 views
1

fgets()를 사용하여 사용자 입력을 얻은 다음 sscanf()를 사용하여 double로 구문 분석합니다. 여기 내 코드 예이다fgets()를 건너 뛰고 사용자 입력을 지우는 방법은 무엇입니까?

int menuItem = 0; 
char input[3]; 
printf("Enter valid menu item"); //values are 1, 2, 3, 4, 5, and -1 
fgets(input, sizeof input, stdin); 
sscanf(input, "%d", &menuItem); 

사용자가 3 자리 입사 (잘못된 입력, 및 I를 적절하게 처리 할) 경우, 에러는,이 자동으로 제 자리 배치하여 내 다음는 fgets()를 생략 발생 다음 입력. 예를 들어, 사용자가 123을 넘어 간다면 이제 다음 fgets를 건너 뛰고 값 3을 입력으로 사용합니다. 이것을 어떻게 지울 수 있습니까? 아니면 최대 1 자릿수까지만 읽을 수 있습니까? (여전히 -1을 처리 할 수 ​​있습니다.)

답변

3

왜 입력 배열을 커지시겠습니까? 50 바이트와 마찬가지로 ... 사용자가 다수를 입력하면 바보이며 이상한 행동을 할 자격이 있습니다.)

이것은 당연히 우아하지 않지만 원근법으로 생각하면 아마도 여기에 산업 강도가있는 코드를 작성하지 않은 것일 수 있습니다. 어리석은 버그를 수정하는 것이 가장 간단한 솔루션입니다.

[편집]

경우 당신은 내가이 제안 이유에 혼동된다. 입력 배열은 2 개의 값과 null 종결자를 포함 할 수있을만큼 커야합니다. 따라서 분명히 사용자가 두 가지 선택 사항이 아닌 단일 선택을 입력했는지 확인할 수있을만큼 충분히 커야합니다.

+0

좋은 생각 - 어쨌든 많은 자릿수를 입력하는 것은 드문 경우라고 생각합니다. 나는 당신이 제안한 것을 할 가능성이 가장 높다고 생각하지만 호기심 때문에 어쨌든 나는 그런 오류를 어떻게 처리 할 것인가? 즉, 내가 [50]을 입력하고 80 문자를 입력한다고 가정 해보십시오. 버퍼에서 여분의 것들을 지우려면 어떻게해야합니까? 그러면 자동으로 다음 fgets()에 배치되지 않습니다. –

+0

'fgets'는 줄 바꿈 문자를 유효한 것으로 취급하기 때문에 문자열에서 그 줄 문자를 기대할 수 있습니다. 따라서 예상되는 문자와 개행 문자, 그리고 NULL 종결자를위한 충분한 공간을 항상 남겨 두어야합니다. 일단 당신이 당신의 가치를 가지고 있다면,'\ n'을 찾으십시오. 그것을 찾지 못하면,'fgets'를 다시 호출하십시오 (그리고 반복하십시오). 최대 문자 수를 읽은 경우에만이 작업을 수행해야합니다. 이것은 특수한 경우 (예 : Ctrl-D) 또는 다른 조기 EOF (파일 또는 파이핑 읽기의 경우)에서 문제를 일으킬 수 있습니다. 개행 문자는 운영 체제마다 다르므로 특별한주의가 필요합니다. – paddy

2

입력 버퍼는 1 자리, 1 줄 바꿈 및 1 단말 null '\0'을 허용합니다. 실제로는 그렇지 않습니다. 충분히 커.

사용자가 100과 그 뒤에 개행 문자를 입력했다고 가정합니다. fgets()에 대한 첫 번째 호출은 두 자리 (10)를 읽고 두 번째 호출은 세 번째 숫자와 개행을 읽습니다. 다음 호출은 다음 입력을 대기합니다.

버퍼 크기를 좀 더 현명하게 늘리십시오. 필자가 작성한 많은 프로그램에서 4096의 버퍼 크기를 사용합니다. POSIX 표준은 _POSIX2_LINE_MAX를 2048로 설정합니다. 불만이라면 64 또는 128과 같은 편리한 번호를 사용하십시오. 너는 너무 멀리 잘못하지 않을 것이다.

fgets()sscanf()을 사용하는 기술은 확실히 좋은 방향이지만, sscanf()은 올바른 값 개수를 분석해야합니다. fgets()sscanf()의 장점 중 하나는 사용자가 입력 한 행에서 잘못된 점에 대해 더 나은 보고서를 작성할 수 있다는 것입니다. fscanf() 또는 scanf()을 직접 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다.

관련 문제