본문 바로가기

C언어

[C언어] scanf()의 정의와 오류, 문자열 입력받는 3가지 방법scanf(),gets(),fgets()

 

 



 

안녕하세요. 오늘은 C언어로 문자열을 입력받는 방법에 대해서 알려드리도록 하겠습니다.

대략적인 3가지 scanf() , gets() , fgets() 를 알려드리겠습니다.


scanf() 정의

#include <stdio.h>
int scanf(  const char *format [, argument]...);

scanf 함수란?

표준 입력 스트림(#include <stdio.h>)에서 데이터를 읽고 에서 stdin 지정한 위치에 데이터를 씁니다. argument 각 argument 은 의 형식 지정자(const char *format) 에 해당하는 형식의 변수에 대한 포인터여야 합니다. 

 

따라서 우리는 일반적으로 scanf()를 사용할 때 

char a;
scanf("%c",&a);

 형식지정자 format인 "%c" 에 해당하는 형식의 변수 a 에 대한 포인터 주소 &를 붙여주는 것입니다.

 

scanf()함수는 %s 형식 지정자를 사용해서 문자열을 입력 받을 수 있는데 이때 %s형식 지정자를 사용한 scanf("%s",)는 

공백(스페이스바) '\0'줄바꿈(엔터키) '\n'입력받기 전까지 문자열을 &주소 변수에 저장합니다. 그리고 \0 이나 \n은 버퍼에 저장하게 됩니다.

그래서 scanf를 연달아서 쓰게 되면 입력은 한번밖에 하지 않았는데 원래의 입력 + 공백or 엔터기 를 입력했을 때 그 두가지 경우가 버퍼에 저장되어 다음 scanf의 입력때 공백이나 \n의 입력이 되는 것입니다.

이를 해결하기 위해서는 scnaf() 사용시 뒤에 getchar(); 를 사용하거나 fflush(stdin)을 사용해서, 공백 or 줄바꿈 이 남아있는 버퍼를 비워주어야 합니다.

<getchar() 문자 한개를 받을수 있는 녀석>

<fflush(stdin)> 출력 버퍼를 비우는 녀석>


 


문자열 입력 받는 방법 1. scanf() 사용

 

앞서 설명한 scanf는 공백을 문장의 끝으로 판별하는 성질을 갖고 있습니다. 따라서 우리는 scanf()를 사용해서 공백이 있는 문자열 받기를 원할 때 몇가지의 지정을 해주어야합니다.

#include <stdio.h>
int main(void){
	char str[100];
	// scanf("%s", &str);  // i love you 입력
	// printf("%s\n", str);  // i 만 출력됩니다.
	scanf("%[^\n]s", &str); // i love you 입력(공백 포함 문자열 입력)
	printf("%s", str); // i love you 출력됩니다.
    
    return 0;
}

바로 서식 지정자 [^\n] 인데요. 이 듯은 내가 \n 을 입력받기 전까지는 계속해서 문자열을 입력 받을거야~ 라는 뜻입니다. 

scanf("%[^\n]s",&변수); 

 


문자열 입력 받는 방법 2. gets() 사용

#include <stdio.h>
int main(void){
	char str[100];
    gets(str);
	return 0;
}

그냥 gets(문자열 변수) 입력해주시면 끝납니다. 정말 쉽죠? (너무편해~)

하지만 어떤.. (백준이라던가) 사이트에서는 gets같은 비 표준적인 함수는 인정이 안됩니다. 참고하세요!!

 


문자열 입력 받는 방법 3. fgets() 사용

#include <stdio.h>
int main(void){
	char str[100];
    fgets(str,100,stdin); //stdi.. 표준 입력 buffer에서 문자열을 받아옵니다.
    return 0;
}

fgets(변수명,크기,stdin)을 선언하시면 되는데요.

일반적으로 fgets는 FILE을 읽을 때 사용하는 함수입니다. 하지만 stdin을 사용하면 문자열을 입력받을 수 있습니다.!!