이 포스팅은 아래의 글과 연관이 있습니다.
연관된 글 보기 : C 언어 예제, fgets 를 통한 문자열 입력과 표준입력버퍼(stdin) 비우기
C 언어 예제, fgets 를 로 정수(숫자) 입력받기
최근에 입력함수로 scanf 를 버리고 fgets 를 쓰기 시작했다. 그런데 쓰기 시작한지 얼마 안 되어서 그런가 아 함수는 동작 방식이 아직까지 잘 익지가 않는다. 그래서 몇 가지 장난을 좀 쳐 봤다.
#include <stdio.h>
#include <string.h>
int main()
{
char str1[5];
for(;;)
{
printf("입력 : ");
fgets(str1, 5, stdin);
printf("출력 : %s", str1);
}
return 0;
}
몇번 실행을 해 보면 이렇게 된다.
일단 입력하는 갯수가 적은 qwe 까지는 별 문제 없이 동작하는 것을 볼 수 있다. 문제는 그 다음이다.
C 언어 레퍼런스를 보러 자주 가는 블로그 Programming IT 의 게시물 설명에 따르면.....
링크 : http://itguru.tistory.com/38
이렇게 되어 있다. qwer 부터 어그러지기 시작했다는 것을 미루어 가만히 다시 생각해보면....
1. qwer 입력
엔터를 누른 순간 stdin 에는 다음과 같이 들어있을 것이다 : qwer\n
fgets 함수는 여기 설명에 따르면 4개의 문자를 받는다. 그리고 그 뒤에 NULL 문자를 넣는다. 따라서 str1 의 모습은 다음과 같이 된다.
str1[0] : q
str1[1] : w
str1[2] : e
str1[3] : r
str1[4] : \0
그리고 stdin 에는 \n 이 그대로 남아있게 된다. fgets 에서 4개만 긁어가고 말았기 떄문이다.
2. qwert 입력
엔터를 누른 순간 stdin 에는 다음과 같이 들어있을 것이다 : qwert\n. str1 의 모습은 1. 의 경우와 같게 나온다. 그러면 stdin 에는 다음 내용이 남아있게 된다.
stdin : t\n
이 상태에서 fgets 가 다시 실행되면 str1 에 t 만 들어가게 된다.
중략하고 다음 입력을 살펴보자.
3. qwertyui 입력
stdin : qwertyui\n
fgets 이후 str1 :
str1[0] : q
str1[1] : w
str1[2] : e
str1[3] : r
str1[4] : \0
남아있는 stdin : tyui\n
fgets 다시 시행 이후 str1
str1[0] : t
str1[1] : y
str1[2] : u
str1[3] : i
str1[4] : \0
남아있는 stdin : \n
따라서, 다음번 입력/출력 시에는 str1 에 \n 이 들어 있어서 줄이 바뀌게 된다.
C 언어와 파일 입출력, 기본 개념 정리 (0) | 2016.06.11 |
---|---|
struct(구조체)의 인자 다루기 (0) | 2015.04.25 |
char 변수를 int 변수로 바꾸기 (0) | 2014.06.26 |
댓글 영역