이 포스팅은 아래의 글과 연관이 있습니다.
연관된 글 보기 : fgets 의 동작
fgets 로 입력을 받다 보면 문제가 하나 생긴다. 위의 글을 보면 짐작이 될 것이다. 바로 애초에 목표했던 범위 이상의 입력을 받을 경우 그 다음번에 실행하는 fgets 가 영향을 받게 된다는 것이다.
그림을 보고 간략히 설명을 해보자. 만약 qwer 만을 출력하는 것이 목표였는데 실수로 qwerty 를 입력했다고 하자. 일단 fgets 가 네 글자를 읽었다고 치면 표준 입력 버퍼인 stdin 에는 다음과 같은 문자열이 아직 남아있게 된다.
rty + \n
즉, 다음 번에 fgets 를 또 실행하면 의도와는 상관 없이 그 fgets 는 위에 표준 입력 버퍼 stdin 에 남은 부분의 입력을 받게 된다. 그렇다면, 이러한 상황을 피하려면 어떻게 하면 되겠는가? 그 상황을 위해 아래 예제를 만들었다. 원리는 간단하다. 범위를 넘어서지 않는 입력을 받게 된다면, 읽어들인 문자열의 마지막 문자가 개행문자로 끝이 나게 될 것이다. 범위를 넘어서는 입력을 받았다면, 문자열의 마지막 문자는 개행문자가 아닐 것이다.
즉, 위와 같은 경우가 될 경우에만 입력 버퍼 stdin 을 따로 비워주면 된다는 것이다. 이를 시험까지 해서 실행해 보면 아래와 같은 결과를 도출할 수 있도록 하는 것이다.
간략히 설명하자면, 아래 예제는 최대 10개 까지의 문자를 입력받기 위해 만들었다. 그 이상 들어올 경우 쳐내면 된다. 만약에 위 과정이 제대로 수행되지 않아서 표준 입력 버퍼(stdin) 가 비워지지 않았다면, 출력 란에는 아래와 같이 나왔을 것이다.
출력 : aaaaaa.....
함수가 두 개가 쓰였는데 써먹은 함수는 input_string 함수이고 밑에 check_stdin 은 위 상황을 연출하기 위해서 만든 함수니까 무시해도 된다. 코드는 아래와 같다.
#include <stdio.h>
#include <string.h>
char input_string(char *dest, int form);
char check_stdin(char *dest, int form);
int main()
{
char str1[11];
char str2[11];
input_string(str1, 11);
printf("stdin 에 남은 것이 있는지 점검 \n");
check_stdin(str2, 11);
printf("출력 : ");
printf("%s \n", str2);
return 0;
}
char input_string(char *dest, int form)
{
int i;
fgets(dest, 11, stdin);
for(i=0;i<11;i++)
{
if(dest[i]=='\n')
{
dest[strlen(dest)-1]='\0';
break;
}
else if(dest[i] != '\n' && i==10)
{
printf("입력 가능한 범위를 넘어섰습니다. \n");
dest[0]='\0';
while(getchar() != '\n')
{
}
break;
}
}
return 0;
}
char check_stdin(char *dest, int form)
{
printf("입력 : ");
fgets(dest, 11, stdin);
dest[strlen(dest)-1]='\0';
return 0;
}
C 언어 예제, 도서 관리 프로그램 확장판(스압) (0) | 2015.04.11 |
---|---|
C 언어 예제, fgets 로 정수(숫자) 입력받기 (0) | 2015.03.31 |
C 언어 예제, text(메모장) 파일에서 입력받기 (0) | 2015.01.18 |
C 언어 예제, 연결 리스트 연산, 데이터 자유자재로 추가 제거 (0) | 2015.01.08 |
C 언어 예제, 메모리 동적 할당 + 구조체와 노드 다루기 (0) | 2015.01.05 |
댓글 영역