상세 컨텐츠

본문 제목

fgets 의 동작

컴퓨터 관련/프로그래밍 공부

by 열정과 함께 2015. 3. 8. 01:15

본문

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


연관된 글 보기 : 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 이 들어 있어서 줄이 바뀌게 된다.

관련글 더보기

댓글 영역