프로그래밍/C언어

fgets함수 사용할때 주의점

콘파냐 2014. 1. 24. 17:52
반응형

fgets함수는 스트림의 정보를 스트림에 입력해준다.(문자열)

스트림이란 말이 생소한 사람도 있지만, 흔히 말해서 데이터가 존재하고 그 데이터의 입력 또는 출력이 가능한 장치(파일,모니터,키보드)들을 가르켜 스트림이라고 한다.

자세한 사용법은 파일 입출력을 공부해야하므로 넘어가도록한다.


fegts은 스트림을 입력 받을때 엔터까지입력 받는 신기한 함수다.

때문에 위 함수로 입력 받은 문자열의 길이는 입력한 문자열+1이 된다.

이 함수를 제대로 쓰려면 문자열을 수동적으로 맞춰줘야한다.

방법은 여러가지가 있겠지만 가장 일반적인 방법을 소개한다.

비교를 위하여 아래는 gets을 먼저 사용한 일반적인 입력이다. 실행후 gets에 답을 문자열은 my home을 입력하였다.



워낙 간단한 코드라 대충 짠 점은 양해 바란다.

그래도 설명하고 넘어가겠다.

우선 a라는 문자배열을 생성하여 my home을 넣었다. 아래 결과에서처럼 문자열의 길이를 출력하는 데 7이라는 결과가 나왔다.

배열을 버퍼로 재사용하기 위해서 memset함수로 배열을 초기화 하였다.

gets을 통해서 문자열을 입력받고 그 길이를 재어보니 똑같이 7이 나왔다. 출력 후미에 000을 붙여놓았다. gets 사용시 문자열뒤에 어떤 특정한 값이 붙나 확인하기 위함이다.

위 출력값은 아무이상없다. 이젠 gets을 fgets함수로 대체하고 위와 똑같이 수행해보자.




stdin은 표준입력 스트림이다. 이것은 키보드의 입력을 말한다.

결과를 보면 7자의 문자열을 8자라고 인식했다. 그다음 출력을 보면 000부분이 개행이 되었다.

결론을 말하자면, 엔터문자가 포함되어서 문자열이 7+1이 된 것이고 000이 개행되어 출력된 것이다.


이것을 간단하게 고치기 위해선 입력 버퍼를 포인터 연산을 통해서 문자열의 길이를 하나 줄여줘야한다.

포인터 연산에 관한 글은 C언어 포인터에 대한 이해(3)에 있다.


2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1)


2014/01/12 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(2)


2014/01/13 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(3)


포인터연산 

*(a+strlen(a)-1)='\0'; 을 추가해준다.

엔터값이 있는 곳에 널문자를 입력해 준 것이다.

실행해보면 정상적으로 나올 것이다.

사실 이런 c언어상에서의 입출력을 요즘 쓸일은 없다. 그래도 재밋지 않은가?

반응형