프로그래밍/C, C++

[C] 문자열 fgets, gets 차이

pxatd 2021. 3. 15. 07:25
728x90

문제

입력

$ aldjfdie

$ ajfhw djfoq

출력

aldjfdie:8

ajfhw djfoq:11

 

학습

C언어를 다루면서 input할 때 가장 많이 사용했던 입력방법은 scnaf이다. 대부분의 자료형을 받을 수 있으며 편리하고 간단하게 사용할 수 있기 때문이다. 하지만 문자열 문제를 풀면서 문자열에 공백이 들어가고, 크기를 초과하는 순간 scanf는 사용할 수 없다는 것을 알게되었다. 그래서 새롭게 찾은 입력방법이 gets와 fgets이다. 앞서 백준judge로 공부하면서 gets의 사용법에 대해 익힌적이 있기 때문에 이번에는 gets와 fgets의 차이에 중점을 두고 학습하였다. 

 

우선 scanf와 gets를 비교해보면, 공백을 기준으로 scanf는 공백 앞까지 저장하고, gets는 공백을 포함한 문자열을 저장한다. cordingdiary.tistory.com/30 여기에서 다루었다. 

 

gets와 fgets의 차이는 매개변수에서 있다. 

 

gets(버퍼)

fgets(버퍼, 버퍼의크기, 읽어올 포인터)

 

또한 여기에서 알 수 있는 점은 gets는 버퍼의 크기를 매개변수로 받지 않기 때문에 값을 초과해서 읽는 오류가 발생할 수 있다. 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 101
int main()
{
	char buffer[BUFFER_SIZE];
	int n = 1;

	while (1)
	{// gets는 버퍼사이즈를 받지 않기때문에 초과해서 읽을 수 있는 일이 발생
		printf("$ ");//gets말고 fgets를 쓰는 추세, 매개변수 3개 필요, 버퍼, 버퍼사이즈)gets와 차이, 읽어올 포인터(여기서는 표준입력파일=키보드) 
		fgets(buffer, BUFFER_SIZE,stdin); //scanf는 공백 기준으로 저장, gets는 공백포함 저장
		//fgets는 줄바꿈 문자까지 버퍼에 저장한다 
		buffer[strlen(buffer) - 1] = '\0';//null char로 바꿔줌 
		printf("%s:%d\n", buffer, strlen(buffer));
	}
	return 0;
}
728x90