C언어 문자 및 문자열 입출력 함수 예제

C언어 문자 및 문자열 입출력 함수에는 scanf()printf()가 사용됩니다. 그 밖에 버퍼 유무에 따라서 사용되는 함수가 따로 있습니다.

C언어 문자 입출력 함수

scanf()와 printf()와 문자 입출력

scanf()printf()는 문자를 입출력하는 기본 함수입니다.

scanf()의 장점은 문자, 문자열 자유롭게 출력 할 수 있으며, 입력 사항을 백스페이스로 수정할 수 있습니다. 또한 입력된 문자가 화면에 같이 출력됩니다.

#include <stdio.h>

int main()
{
	char x;

	printf("문자를 입력하세요. \n");

	scanf("%c", &x); //입력한 문자 화면에 자동 출력

	printf("%c", x); //문자 출력
}

결과

문자 a를 입력했다면 결과는 아래와 같습니다.

문자를 입력하세요.
a
a

scanf()의 단점은 자료형마다 %c, %s, %d 등의 서식 설정의 귀찮음이 있습니다. 또한 버퍼 때문에 연속 사용시 데이터 누락이 발생할 수 있습니다.

버퍼는 데이터 임시 저장소입니다. C언어는 문자를 한 글자 입력할 때 마다 입력과 출력을 하지 않고, 버퍼라는 임시 저장소에 저장을 해둡니다. 이 후 Enter를 누르면 \n 개행문자가 들어가면서 그제서야 버퍼에 저장했던 문자를 내보냅니다. 이 방법의 단점은 개행 문자 \n도 임시 저장소에 들어간다는 점입니다. scanf() 함수를 연속 사용해보면 오류가 나기 때문에 버퍼가 어떤 의미인지 직관적으로 알 수 있습니다.

#include <stdio.h>

int main()
{
	char x;
	char y;

	printf("문자를 두 번 입력하세요. \n");

	scanf("%c", &x);

	scanf("%c", &y);

}

결과

알파벳 a를 누르고 Enter를 눌렀다면 결과는 아래와 같습니다. scanf(&x)에서 a + Enter를 입력받으면 버퍼에 a\n를 저장합니다. 그리고 버퍼는 scanf(&x)에는 a를 주고, scanf(&y)에는 \n를 주기 때문에 실행되지 않고 바로 종료됩니다.

문자를 두 번 입력하세요.
a

첫 번째 해결 방법은 getchar()라는 함수를 중간에 삽입하면 됩니다. 이 함수가 버퍼에 저장된 \n 문자를 받아서 버퍼가 초기화됩니다.

#include <stdio.h>

int main()
{
	char x;
	char y;

	printf("문자를 두 번 입력하세요. \n");

	scanf("%c", &x);

	getchar(); //버퍼 초기화

	scanf("%c", &y);

}

결과

a, b를 입력했다면 결과는 아래와 같습니다. getchar() 함수에 개행문자가 입력되면서 버퍼가 초기화되므로 두 번째 scanf()에 정상적으로 데이터가 입력될 조건이 준비됩니다.

문자를 두 번 입력하세요.
a
b

두 번째 방법은 처음부터 몇 개 이상의 문자를 입력할지 사용자에게 지정해주면 됩니다. 예를 들어 입력받아야 할 문자가 2개 라면, 처음 부터 2개의 문자를 연속적으로 입력받으면 됩니다. 이 경우 버퍼에는 문자 2개 + \n가 저장됩니다. 다시 scanf()로 나올 때는 앞의 문자 2개만 나오므로 해결됩니다.

#include <stdio.h>

int main()
{
	char x;
	char y;

	printf("문자를 두 개 연속 입력하세요. \n");

	scanf("%c", &x);

	scanf("%c", &y);
}

결과

입력 문자가 ab라면 결과는 아래와 같습니다.

문자를 두 개 연속 입력하세요.
ab

getchar()와 putchar()와 문자 입출력

getchar()putchar()는 문자를 1개 입출력 받는 함수입니다. scanf()printf()와 기능은 비슷합니다.

getchar()의 장점은 scanf()와 달리 서식 입력이 필요없으므로 코드가 간결합니다. 또한 scanf()처럼 입력받은 값을 화면에 출력해줍니다.

#include <stdio.h>

int main()
{
	char x;

	printf("문자를 입력하세요. \n");

	x = getchar(); //입력받는 데이터를 화면에 같이 표시

	putchar(x); //데이터 출력
}

결과

문자를 입력하세요.
a
a

getchar()의 단점은 scanf()와 마찬가지로 버퍼가 있습니다. 해결 방법은 scanf()와 동일하게 getchar()함수를 중간에 삽입하거나 처음부터 입력 문자 개수를 지시합니다.

#include <stdio.h>

int main()
{
	char x;
	char y;

	printf("문자를 두 번 입력하세요. \n");

	x = getchar(); //입력받는 데이터를 화면에 같이 표시

	getchar(); //버퍼 데이터 초기화

	y = getchar();
}

결과

문자를 두 번 입력하세요.
a
b

getch()와 putch()와 문자 입출력

getch()putch()는 버퍼가 없고, 속도가 빠릅니다. 대신 백스페이스로 수정이 불가능하며, 입력 내용이 화면에 표시되지 않습니다. 또한 표준 형식이 아니라 컴파일러마다 호환성이 다르므로 유의합니다. getche()는 기능은 같고 화면에 입력 데이터를 출력한다는 차이점이 있습니다.

#include <stdio.h>

int main()
{
	char x;
	char y;

	printf("문자를 입력하세요. \n");

	x = getch(); //입력 받는 데이터를 화면에 표시하지 않음

	putch(x); //데이터를 출력
}

결과

문자를 입력하세요.
a

C언어 문자열 입출력 함수

scanf()와 printf()와 문자열 입출력

scanf()printf() 함수는 문자열에도 입력 개수만 정확하게 적는다면 자유롭게 사용할 수 있습니다.

#include <stdio.h>

int main()
{
	char x[5]; // 문자 공간 5 칸 생성

	printf("알파벳 4 문자를 입력하세요."); //유도 메시지

	scanf("%s", &x); // 문자 4개 + \n 1개 저장, 입력값 화면에 표시

	printf("%s", x); //문자 4개 출력
}

결과

abcd를 입력했다면 결과는 아래와 같습니다.

알파벳 4 문자를 입력하세요.abcd
abcd

scanf()의 단점은 서식을 사용해야 되는 귀찮음과 공백이 섞이 문자열은 입력받을 수 없다는 단점이 있습니다.

#include <stdio.h>

int main()
{
	char x[6]; // 문자 공간 6 칸 생성

	printf("ab cd 를 입력해보세요."); //유도 메시지

	scanf("%s", &x);

	printf("%s", x);

}

결과

ab cd를 입력했지만 ab만 데이터에 출력됩니다. scanf()는 공백 뒷부분은 입력되지 않습니다.

ab cd 를 입력해보세요.ab cd
ab

gets()와 puts()

gets()puts()를 사용하면 서식 입력없이 코드를 짧게 적을 수 있습니다. 속도가 조금 더 빠릅니다.

#include <stdio.h>

int main()
{
	char x[6]; // 문자 공간 6 칸 생성

	printf("ab cd 를 입력해보세요."); //유도 메시지

	gets(x);

	puts(x);

}

결과

ab cd 를 입력해보세요.ab cd
ab cd

gets()는 공백 문자열도 자유롭게 입력받을 수 있습니다. 대신 문자열의 입출력에만 한정됩니다.