표준 입력함수에는 scanf(), getchar(), getch(), gets_s() 이 있다. 각 함수들의 특징을 살펴보자.
1. scanf()
scanf()함수를 통해 입력을 받으면 입력값은 stdin(입력스트림)에 일시적으로 저장 되었다가, 입력을 마치면 한꺼번에 처리한다. 컴퓨터는 엔터키, 즉 '\n'을 통해서 종료를 알아차린다. 하지만 공교롭게도 컴퓨터는 '\n'또한 입력 버퍼에 저장을 한다. 따라서 scanf()함수를 사용할때 '\n'을 고려해야 하는데, 예시를 통해서 상황을 살펴보자.
다음과 같은 코드가 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int num;
char a;
printf("숫자 입력:");
scanf("%d", &num);
printf("문자 입력:");
scanf("%c", &a);
return 0;
}
실행 결과는 다음과 같다.
작성한 코드에 따르면 숫자를 입력받고 문자를 입력받아야 한다. 1을 입력하고 숫자 입력을 종료하기 위해서 엔터키를 누르게 된다. 이 때 입력버퍼에는 '1\n'이 저장되는데, %d를 통해 숫자 데이터를 입력받으므로 숫자 1을 처리하고 입력버퍼에는 '\n'이 남게된다. 문자를 입력 받아야하지만 입력버퍼안에는 공백문자'\n'이 남아 있으므로 &a에는 '\n'이 자동으로 저장되고 문자는 입력받지 않고 넘어간다.
따라서 &a에 저장 된 값을 출력해 보기 위해 printf("%c출력",a); 코드를 추가하여 실행해 보면 다음과 같이 출력이 한 칸 개행되어 나타난다.
scanf()함수에서 %d는 숫자, %c는 문자, %s는 문자열이 실질적인 데이터 값이다. 입력버퍼에서 실질적인 데이터가 나오기 전 까지 남아있는 공백문자('\n', ' ', '\t)들은 모두 무시하게 된다. 따라서 %d, %s와 같은 데이터를 사용할 때는 '\n'을 고려하지 않아도 되지만, %c 문자 데이터를 사용할 때는 위와 같은 상황을 고려하여 사용해야한다.
2. getchar()
- 하나의 문자를 받아서 반환하고, 입력버퍼(stdin)를 사용하는 함수이다.
- scanf()함수와 같이 엔터키(\n)을 통해서 입력 종료를 알리고, 버퍼에 '\n'을 저장한다.
getchar()함수의 실행 예시를 살펴보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char num;
num=getchar();
printf("%c", num);
return 0;
}
getchar()함수는 단일문자를 입력받는 함수이므로 숫자를 입력받더라도 %c로 데이터를 받아야한다.
getchar()함수는 숫자를 입력받을 때 두자리 이상의 숫자는 입력받지 못한다는 단점이 있다.
다음은 두자리수인 '12'를 입력받고 출력해본 결과이다.
getchar()함수는 scanf()함수에서 문자를 입력받을 때 발생하는 문제를 해결하기위하여 사용하기도 한다.
scanf()함수에서 실행한 코드를 다음과 같이 추가하여 실행해 보았다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int num;
char a;
printf("숫자 입력:");
scanf("%d", &num);
getchar();
printf("문자 입력:");
scanf("%c", &a);
return 0;
}
추가한 getchar()함수가 '\n'을 받아 입력버퍼에는 아무것도 남지 않게 된다. 따라서 &a에 문자'a'를 저장할 수 있게 되었다.
3. getch()
- 입력버퍼를 사용하지 않으며, 단일 문자를 입력받기 때문에 한 문자를 입력하자마자 종료된다.
- 사용방법은 getchar()과 비슷하다.
- 입력문자가 보이지 않는다.(보안용)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char ans;
printf("게임을 계속 하시겠습니까?(Y/N)");
ans = getch();
if (ans == 'Y')
printf("\n게임을 계속하겠습니다\n");
else
printf("\n게임을 종료하겠습니다\n");
return 0;
}
4. gets_s()
- 문자열 단위로 입력받는 함수이다.
- '\n'은 문자열에 포함되지 않는다.
- '\0'(널문자)은 자동으로 맨 마지막에 추가된다.
scanf(%s, &word)와의 차이점
%s는 하나의 단어만을 입력받는다. 줄 단위로 입력받을 때 gets_s()를 사용하여야 한다.
실행 예를 통해 살펴보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char word[12];
char words[12];
printf("문자를 입력하시오:");
scanf("%s", &word);
printf("scanf함수:%s\n", word);
while(getchar()!='\n');
printf("문자를 입력하시오:");
gets_s(words, sizeof(words));
printf("gets_s함수:%s\n",words);
return 0;
}
"hello world"를 scanf()함수를 통해서 입력받았을 때는 "hello"한 단어만 저장된다. 따라서 한 줄 전체를 저장하기위해서는 gets_s()함수를 사용해야한다.
위 예시와 같이 gets_s()함수는 gets_s(문자배열, 최대문자개수)형식으로 사용하면 된다.
'Programming Language > C' 카테고리의 다른 글
[C] strcmp() (0) | 2020.11.26 |
---|---|
[C] 16진수 표현 (0) | 2020.11.25 |
[C] strcpy() strncpy() (0) | 2020.11.24 |
[C] write() 함수 (0) | 2020.11.20 |
[C] 포인터 연산 (0) | 2020.11.05 |