상세 컨텐츠

본문 제목

C 언어 예제, fgets 를 통한 문자열 입력과 표준입력버퍼(stdin) 비우기

컴퓨터 관련/C 언어 예제

by 열정과 함께 2015. 3. 22. 04:39

본문

이 포스팅은 아래의 글과 연관이 있습니다.


연관된 글 보기 : 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;

}




관련글 더보기

댓글 영역