본문 바로가기

Linux/C

[c] gets( ) vs scanf( )

gets( )와 scanf( )는 둘다 Buffered IO이다. 개행문자 '\n'에서 두 함수는 차이점을 보이는데, gets( )는 사용자가 입력한 개행문자 까지 읽어 들이지만 scanf( )는 사용자가 입력한 '\n'를 입력 버퍼에 남겨두게 된다. 다음과 같은 코드를 VS에서 실행시키고 "Hello"를 입력한다.

입력버퍼에 입력되는 글자는 Hello와 아래의 노란 박스 부분에서 확인 할 수 있는 사용자가 입력한 '\n' 그리고 그 뒤에 scanf( )가 붙인 '\n'가 들어있는것을 확인 할수 있다.

Hello를 모두 읽고 나면 버퍼에 여전이 '\n'이 남아 있는 것을 확인 할 수 있다. _cnt는 읽기 위해서 입력버퍼에서 남아 있는 문자의 개수 이다. _ptr은 입출력 포인터인데 이동하면서 읽고 난 위치를 나타낸다. 

이제 gets( )를 테스트 하기 위해 다음과 같은 코드를 실행하고 Hello를 입력 해보자.

Hello를 모두 읽고 나면 버퍼에는 gets( )가 붙인 '\n'만 남아 있고, _cnt가 0이므로 더이상 읽을 문자가 없는 것을 확인 할 수 있다.

따라서 만약에 다음과 같은 코드를 작성한다면 원하는 값을 얻지 못할 수 있다.

[console 결과]
age : 10
name : 계속하려면 아무 키나 누르십시오 . .


그래서 scanf( )로 값을 읽고 난 이후에는 getchar( )로 문자 하나를 읽어 주거나 scanf("%d %*c",age); 이렇게 사용하여 개행문자를 비워 주어야 한다. 다음과 같이 코드를 다시 작성하면 원하는 값을 얻을 수 있다.

[console 결과]
age : 10
name : serena 계속하려면 아무 키나 누르십시오 . .

  

'Linux > C' 카테고리의 다른 글

[c] size_t의 포멧형식  (0) 2018.01.31
[C] sizeof() vs strlen()  (0) 2017.03.18