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()
는 공백 문자열도 자유롭게 입력받을 수 있습니다. 대신 문자열의 입출력에만 한정됩니다.