27. getchar, gets, gets_s 함수

int getchar(void);

getchar 함수는 최종 사용자가 입력한 스트림에서 하나의 문자 아스키 코드 값을 얻어오는 함수예요.

◈ getchar 함수를 사용한 예

#include <stdio.h>
int main()
{
    char c = '\0'; //char 형 변수 c를 선언하고 '\0'(널문자)로 초기화
    c = getchar();
    printf("문자: %c  아스키 코드 값: %d \n",c, c);
    c = getchar();
    printf("문자: %c  아스키 코드 값: %d \n",c, c);
    c = getchar();
    printf("문자: %c  아스키 코드 값: %d \n",c, c);
    return 0;
}

◈ 실행 결과

ab (최종 사용자가 ab를 입력했다고 가정)
문자: a  아스키 코드 값: 97
문자: b  아스키 코드 값: 98
문자:
  아스키 코드 값: 10  

char * gets(char *buf);
char * gets_s(char *buf ,size_t size);

gets와 gets_s 함수는 최종 사용자가 입력한 스트림을 입력 인자로 받은 메모리에 문자열로 설정하는 함수죠.
반환 값은 입력 인자로 전달받은 메모리 주소를 그대로 반환해요.

gets 함수는 버퍼의 크기를 전달하지 않아 버퍼 오버플로우 버그가 발생할 수 있어요.
이를 개선한 함수가 gets_s 함수예요.

그리고 gets와 gets_s 함수는 공백을 포함하여 문자열을 입력받을 수 있어요.

◈ gets_s 함수를 사용한 예

#define MAX_NAME_LEN    100
#define MAX_ID_LEN         100
#include <stdio.h>
int main()
{
    char name[MAX_NAME_LEN+1] ="";
    char id[MAX_ID_LEN+1]="";
    printf("이름을 입력하세요.\n");
    printf("입력한 이름은 %s입니다.\n",gets_s(name,sizeof(name))); // 리턴 값을 이용해 출력
    printf("%s의 아이디를 입력하세요.\n",name);
    gets_s(id);
    printf("%s의 아이디는 %s입니다.\n",name,id);
    return 0;
}

◈ 실행 결과

이름을 입력하세요.
홍길동 (최종 사용자가 홍길동을 입력했다고 가정)
입력한 이름은 홍길동입니다.
홍길동의 아이디를 입력하세요.
eh.hong (최종 사용자가 eh.hong을 입력했다고 가정)
홍길동의 아이디는 eh.hong입니다.