getchar 함수와 putchar 함수, 버퍼의 개념
#include<stdio.h>
int main() {
int ch;
ch = getchar();
printf("입력한 문자: ");
putchar(ch);
putchar('\n');
return 0;
}
getchar(void);
putchar(int);
getchar 함수는 매개변수가 없고, 키보드로 입력한 문자의 아스키 코드값을 반환합니다.
반환값은 필요에 따라 int형 변수로 받을 수도 있고 char형 변수나 배열에 옮겨 문자나 문자열로 사용할 수도 있습니다.
getchar함수는 scnaf 함수와 마찬가지로 공백문자, 탭문자, 개행문자도 입력하는데 이런 문자들을 제외하는 옵션이 없습니다.
putchar 함수는 문자 상수나 문자의 아스키 코드값을 인수로 주면 해당 문자를 화면에 출력합니다.
그리고 출력한 문자를 다시 반환하며 출력 과정에서 에러가 발생하면 -1을 반환합니다.
암기 꿀팁
put의 뜻은 놓는다.
get의 뜻은 얻는다 입니다.
(put) 놓는다는 내가 가지고 있어야 놓을 수 있죠. 그래서 이미 가지고 있습니다.(함수를 사용할 때 매개변수로 줌)
(get) 얻는다는 누군가가 주어야 얻을 수 있습니다. 그 누군가가 여기서는 사용자이죠. 사용자가 입력값을주어야 합니다.
그래서 매개변수가 없고 키보드로 입력한 값이 매개변수가 됩니다.
둘다 ~char 라는 이름에서 알 수 있듯이 아스키 코드 값을 반환 합니다.
문자열을 받아 char 배열에 저장하는 함수 구현
#include<stdio.h>
void my_gets(char* str, int size);
int main()
{
char str[7];
my_gets(str, sizeof(str));
printf("입력한 문자열: %s\n", str);
return 0;
}
void my_gets(char* str, int size)
{
int ch;
int i = 0;
ch = getchar(); //get user's input into address'ch' START
while ((ch != '\n') && (i < size - 1)) //repeat to maximum array index -1
{
str[i] = ch;
i++;
ch = getchar();
}
str[i] = '\0'; //maximum index room change to NULL
}
while 문을 사용해 index 최대값 -1 만큼 값을 넣고
최대값에는 마지막에 NULL값을 넣어준다.
#include<stdio.h>
int main()
{
int num, grade;
printf("학번 입력: ");
scanf("%d", &num); //get user input to num
getchar(); //getchar의 단독 사용, scanf 다음에 오는 개행문자가 버퍼에 남아있다가 아래의 getchar()에 영향을 주는것을 이녀석이 받아준다. 이 행을 주석처리하고 실행해보면 알 수 있다.
printf("학점 입력: ");
grade = getchar(); //위에서 버퍼가 처리 되었기 때문에 scnaf 행에서 개행문자가 영향을 주지 못한다.
printf("학번: %d, 학점: %c", num, grade);
return 0;
}
버퍼 처리 방법
scanf 행에서 사용자가 입력 할 때 num 에는 입력값만 들어가지만 개행문자가 버퍼에 남게 되는데
해당 버퍼를 처리하지 않으면 남아 있던 개행문자가 getchar() 를 사용 했을 때, 영향을 미치게 된다.
getchar()의 단독 사용으로 버퍼를 처리함으로서 문제가 해결된다.
버퍼는 어떤 데이터를 담아두는 개념이다.
데이터가 이동할 때 한꺼번에 모아서 이동하는게 효율적이기 때문에 버퍼를 사용한다.