나의 IT일지
기타 입출력함수 본문
컴파일러를 사용할 때, printf()와 scanf()를 통해 입출력을 할 수 있다. 그렇다면 다음 소스코드를 한번 보자.
#include<stdio.h>
void main() {
int grade;
char point;
printf("성적:");
scanf("%d", &grade); //int_a의 주소에 3자리 정수를 저장
printf("학점:");
scanf("%c", &point);
printf("%d점은 %c학점입니다", grade, point);
}
위의 코드를 실행해서 성적에 100, 학점에 A를 입력하려고 하면, 다음과 같은 결과가 나온다.
성적 100만 입력이 되고, 학점이 입력이 되지 않는 것을 알 수 있다. 왜 이러는 것일까?
getchar(), putchar()
성적 100만 입력이 되고, 학점이 입력이 되지 않는 이유는 성적 입력 후에 사용하는 엔터가 문자로 인식되기 때문이다. 이는 "scanf()"가 문자형을 받을 때 나타나는 현상인데, "scanf"가 정수형을 받을 경우 엔터만 치면 인식을 하지 않지만 문자형을 받을 경우 엔터만 쳐도 인식이 되는 것을 알 수 있다.
즉, 성적을 입력하고 엔터를 하게 되면, point를 입력할 "scanf()"가 엔터값을 인식하기 때문에, 성적값과 엔터값이 각각 변수grade, 변수point에 입력이 된다.
그렇다면 엔터값을 따로 저장을 할 수 있어야 하는데, 이것은 함수 getchar()를 이용하면 해결이 된다.
getchar()함수란 한 문자만 입력할 때 사용하는 함수로, 버퍼를 사용하여 변수에 저장하는 함수이다.
이때 버퍼는 데이터 임시공간으로, 키보드를 입력한 데이터들을 메모리에 전송할 때, 버퍼에 저장을 한 뒤, 묶어서 전송하게 하는 역할을 한다. 띄어쓰기, 엔터 또한 데이터로 인지되기 때문에 버퍼에 저장이 되어서 전송이 된다.
그럼 위의 코드를 수정을 하면 다음과 같다.
#include<stdio.h>
void main() {
int grade;
char point;
printf("성적:");
scanf("%d", &grade);
getchar();
printf("학점:");
scanf("%c", &point);
printf("%d점은 %c학점입니다", grade, point);
}
이때, getchar()함수도 입력함수이며, scanf()함수도 입력함수인데, 이 둘의 차이를 궁금해 할 수 있다.
#include<stdio.h>
void main() {
char i, j, k;
i = getchar();
putchar(i); //putchar(변수명 또는 문자형상수)
j = getchar();
putchar(j);
k = getchar();
putchar(k);
}
#include<stdio.h>
void main() {
char i, j, k;
scanf("%c",&i);
printf("%c",i);
scanf("%c", &j);
printf("%c",j);
scanf("%c", &k);
printf("%c",k);
}
위의 두 소스코드는 같은 결과를 가진 코드이다. 즉 scanf()와 getchar()는 비슷한 입력함수이고, printf()와 putchar()는 비슷한 출력함수라는 것을 알 수 있다. 다만 차이가 있다면, scanf()와 printf()는 변수를 통해 입출력하는 형식이라면, getchar()와 putchar()는 어떤 형식의 데이터가 있어도 1개의 데이터만 입출력하는 형식이다. 따라서 2개 이상인 데이터를 사용한다면, getchar()와 putchar()은 처음 데이터만 입출력하게 된다.
getch(), putch()
getcher()가 버퍼를 사용한다면, getch()는 버퍼를 사용하지 않고 출력해 주는 함수이다. 이때 버퍼를 사용하지 않는다는 것이 무슨 의미일까? 아래의 소스코드를 실행해 보자.
#include<stdio.h>
#include<conio.h> //콘솔 입출력 함수를 제공하는 헤더, getch()사용할려면 필요
void main() {
char i, j, k;
printf("입력:");
i = getch();
j = getch();
k = getch();
printf("\n");
printf("출력:");
putch(i); //putch(변수명 또는 문자형상수)
putch(j);
putch(k);
}
실행을 하게 되면, 입력내용을 입력해도 화면에 출력되지 않았으며, 입력하자마자 출력내용이 바로 나타나는 것을 확인할 수 있는데, 이유는 getch()이다. 버퍼를 사용하지 않아, 데이터가 입력하자마자 메모리에 저장되어 바로 출력이 되는 것이다. 그래서 입력한 "123"는 무시되고, 출력으로 인해 "123"이라는 글자가 나타나는 것이다.
gets(),puts()
getcher()와 getch()는 하나의 문자만 출력할 때, 사용하는 함수이며, 구성은 다음과 같다.
gets(변수명)
그렇다면 scanf()와 gets()가 문자열을 출력할 때에는 어떻게 해야 할까?
#include<stdio.h>
void main() {
char str[31];//문자 31개를 저장 할 수 있는 문자열 str변수생성
printf("입력:");
scanf("%s", str); //문자열 입력 할때 &를 붙히지 않음 (이름자체가 주소값)
printf("출력: %s", str);
}
#include<stdio.h>
void main() {
char str[31];//문자 31개를 저장 할 수 있는 문자열 str변수
printf("입력:");
gets(str);
puts(str); //puts(변수명 또는 문자열형상수)
}
위의 두 소스파일은 문자열을 만들어 문자들을 입출력하는 파일이다. 이 두 파일의 입력값을 "hello world"로 하여 실행하면, 출력값이 다르다는 것을 알 수 있다.
scanf()를 사용하는 소스파일에 "hello world"를 입력하면, "hello"로 출력하는 것을 알 수 있다. 이는 scanf()는 공백이 있으면 입력이 끝난 것으로 인식해서 앞부분만 출력하게 때문이다.
반면, gets()은 공백이 있어도 입력한 그대로 출력하기 때문에, 소스파일에 "hello world"를 입력하면, "hello world"를 출력하는 것을 알 수 있다.
'프로그래밍 언어 > C언어' 카테고리의 다른 글
연산자(비트, 삼항, 기타 등등) (0) | 2023.02.07 |
---|---|
연산자(산술, 대입, 증감, 비교, 논리) (0) | 2023.02.06 |
입력함수 scanf (0) | 2023.02.04 |
출력함수 printf (0) | 2023.02.03 |
상수와 키워드 (0) | 2023.02.02 |