본문 바로가기
Programming/C,C++

[C/C++] C언어 공백 문자 포함한 문자열 입력받는 방법 (scanf / fgets)

by yoiii 2021. 2. 24.

안녕하세요 omyo 입니다. 이번 포스팅에서는, 공백 문자를 포함한 문자열을 입력받는 2가지 방법에 대해서 소개해 드리려고 합니다.

scanf("%s",문자열) 을 이용해서 문자열을 받으면, scanf는 공백을 문자열의 끝으로 인식하기 때문에 공백 문자 뒤의 내용이 모두 잘리게 됩니다.

예를들어 다음 코드에 "Hello C World" 문자열을 입력하면 Hello 공백 뒤의 C World 문자열이 모두 잘립니다.

 

#include <stdio.h>
#define LEN 1000000

int main(void){
	char str[LEN];
	scanf("%s",str);
	printf("%s",str);
}

 


1> scanf[] scanset character 

scanf("%[^\n]s", str)

scanset character [] 를 scanf 함수에 추가해 주는 방법입니다.

[^"문자"]의 의미는 해당 문자가 나오기 전 까지 모든 문자열을 받겠다는 뜻 입니다.

개행(엔터)를 의미하는 문자인 "\n" 를 ^뒤에 넣어주면, 개행(엔터)가 나오기 전 까지 모든 문자열을 받겠다는 뜻이 됩니다. 따라서, 공백도 포함해서 입력을 받을 수 있게 되는 것이죠.

 

/* scanset character 예시 */

#include <stdio.h>
#define LEN 1000000

int main(void){
	char str[LEN];
	scanf("%[^\n]s",str);
	printf("%s",str);
}

 

다른 방식으로 응용해 봅시다. 

scanf("%[^abc]", str) ; a or b or c 문자가 나오기 전까지 모든 문자열을 버퍼에 저장합니다.

입력값 : 12345a1234

버퍼(저장)값 : 12345

 

scanf("%[abc]", str) ; a or b or c 문자 "이외의 값" 이 나오기 전까지 모든 문자열을 버퍼에 저장합니다.

입력값 : abcabcd

버퍼(저장)값 : abcabc

 

scanf("%5[abc]", str) ; a or b or c 문자 "이외의 값" 이 나오기 전까지 모든 문자열을 "5자리 까지" 버퍼에 저장합니다.

입력값 : aaabbbccc

버퍼(저장)값 : aaabb


2> fgets() Function

함수원형 : char* fgets(char* str, int num, FILE* pFile);

사용 예시 : fgets("문자열", 100, stdin)

함수 이름인 fgets 는 file + get + string 을 조합한 이름으로, 파일로 부터 문자열을 가지고 온다는 뜻입니다.

단, scanf 함수와 달리 fgets 함수는 공백을 포함하여 문자열을 입력 받습니다.

 

첫 번째 인자 : 문자열을 가리키는 포인터 입니다.

두 번째 인자 : 문자열의 길이를 넣는 변수 입니다.

세 번째 인자 : 파일을 가리키는 파일 포인터 입니다.

 

/* fgets 예시 */

#include <stdio.h>
#define LEN 1000000

int main(void){
	char str[LEN];
	fgets(str,LEN,stdin);
	printf("%s",str);
}

 

scanf와 비교해 보면 속도가 약간 더 빠르네요.


댓글