본문 바로가기

Programing/C/C++

[C] 입력함수 scanf, gets, fgets 함수 문자열 입력시 차이점

[C]  scanf, gets, fgets 함수 문자열 입력시 차이점 





C에서 쓰이는 입력 함수인 scanf, gets, fgets 함수가 문자열 입력 시에 어떠한 차이가 있는지 정리해 보도록 하겠다.




기본적으로 OOOOO(엔터) 를 입력했을 시에




  scanf() 함수로 문자열을 입력시 엔터 전까지 OOOOO 문자열을 가져오고, 마지막에 \0 (문자열의 끝을 알려주는 널문자)을 가져온다. 


                   OOOOO(엔터) ------------> OOOOO\0


 또한 scanf 함수는 공백이 나오면 공백이전까지 저장되고 마지막에 \0문자를 붙여준다. 





 gets() 함수는 OOOOO(엔터) 줄바꿈문자열까지 갖고 온다. 그 후에 \n(줄바꿈문자)를 \0(널문자)로 바꾸어준다.


OOOOO(엔터) ---------> OOOOO(엔터) ------------> OOOOO\0





 fgets() 함수도 gets()와 마찬가지로 OOOOO(엔터) 까지 가지고 온다. 그 후에 \0(널문자)를 추가로 마지막에 덧붙인다.


OOOOO(엔터) ------------> OOOOO(엔터)\0





정리하는 차원에서 함수끼리 비교를 해보자면,


         scanf() 함수는 \n(줄바꿈문자)를 가져오지 않고, 마지막에 \0(널문자)를 붙인다.

         gets() 함수는 \n(줄바꿈문자)까지 가져오고, \n을 \0으로 대체 한다.

         fgets() 함수는 \n(줄바꿈문자)까지 가져오고, 추가적으로 \0을 붙인다.






이 3가지 함수를 비교하는 이유는, 


문자열을 키보드로 입력 할때 문자열이 바로 변수에 들어가는 것이 아니라 버퍼에 들어간다.

그리고 버퍼에서 3가지 함수에 따라서 버퍼에 들어있는 문자열을 가져오게 된다.

우리가 하나의 프로그램에서 여러가지 입력함수를 이용해 문자열 입력을 여러 번 할때 문제가 발생 할 수도 있다. 왜냐하면 scanf() 함수는 \n(줄바꿈문자)를 버퍼에 남기고 가기 때문에, 다음에 입력함수에 쓰인다면 입력함수가 버퍼에 남아 있는 \n만을 가져올 수도 있기 때문이다.



예를 들어, 나이를 입력하고 이름을 입력하는 프로그램을 만든다고 해보자



  우리가 scanf() 함수를 통해 나이를 입력한다면

  18\n이 버퍼에 들어가고, 18이 문자열에 들어가고 \n이 버퍼에 남게 된다.

  그 이후에 우리가 gets()함수를 통해 이름을 입력하고자 한다면, 입력이 되지 않고 버퍼에 남은 \n을 가져와 입력을 끝내므로 , 이름을 저장하는 변수에는 \0 만 남게 된다.








         

'Programing > C/C++' 카테고리의 다른 글

[C] srand 랜덤 함수  (0) 2014.05.05
[C] 2차원 배열 동적 할당  (0) 2014.05.05
char 형 -> int 형으로 전환하기  (0) 2013.04.29
[list] list 모두 삭제하기  (0) 2013.04.22
[list:sort] list:sort() 사용하기  (0) 2013.04.22