scanf 함수 반환값 활용

💡 Enter / 개행문자 때문에 10이 출력된거였다… 💡 cat가 어디서 나온거냐고? 사용자가 입력한 값이다. → cat에 대한 아스키 코드값이 99,97,46인 것이다


 

버퍼를 사용하는 입력 함수

버퍼는 데이터를 보관하는 역할을 하므로 최초 입력할 때 필요한 데이터를 한꺼번에 저장해 놓으면 scanf 함수는 호출 즉시 버퍼에서 데이터를 가져올 수 있다.

#include <stdio.h>

int main(void)
{
    char ch;
    int i;

    for ( i = 0; i < 3; i++)            // 3번 반복
    {
        scanf("%c", &ch);               // 문자 입력
        printf("%c, ch");               // 입력된 문자 출력
    }

    return 0;
}

  

입출력 함수가 버퍼를 사용하면 좋은 점.

첫째, 데이터를 안정적으로 입력받을 수 있다.

  • 버퍼란 일정 크기의 연속된 저장공간이다. 따라서 키보드에 데이터를 입력하면 우선 저수조와 같은 역할을 하는 버퍼에 저장된다. 프로그램이 다른 일을 하느라 해당 입력을 즉시 받지 못해도 데이터가 사라지지 않아 안정적이다는 것이 특징이다.

둘째, 입력장치와 독립적으로 사용할 수 있다.

  • scanf 함수는 키보드와 직접 연결되지 않고 정해진 크기와 형태를 가진 버퍼에서 입력을 받는다. 따라서 입력 장치가 바뀌더라도 함수를 수정하지 않고 사용할 수 있다.
     

scanf 함수 반환값 활용(이거 모르겠음)

#include <stdio.h>

int main(void)
{
    int res;                        // scanf 함수의 반환값을 저장할 변수 
    char ch;                        // 문자를 입력할 변수

    while (1)
    {
        res = scanf("%c", &ch);     // 문자 입력, <Crtl> + <Z>를 누르면 -1 반환
        if (res == -1) break;       // 반환값이 -1이면 반복 종료
        printf("%d", ch);           // 입력된 문자의 아스키코드 값 출력
    }

    return 0;
}

  

getchar 함수를 사용한 문자열 입력

getchar 함수도 버퍼를 사용하는 문자 입력 함수이다.

getchar 함수를 반복 사용하면 한 줄의 문자열을 char배열에 입력할 수 있다.

#include <stdio.h>

void my_gets(char *str, int size);

int main(void)
{
    char str[7];                           // 문자열을 저장할 배열

    my_gets(str, sizeof(str));             // 한 줄의 문자열을 입력하는 함수
    printf("입력한 문자열 : %s\n", str);      // 입력한 문자열 출력

    return 0;
}

void my_gets(char *str, int size)          // str은 char 배열, size는 배열의 크기 
{
    int ch;                                // getchar 함수의 반환값을 저장할 변수
    int i = 0;                             // str 배열의 첨자

    ch = getchar();                        // 첫 번째 문자 입력
    while ((ch != '\n') && (i < size -1))  // 배열의 크기만큼 입력
    {
        str[i] = ch;                       // 입력한 문자를 배열에 저장
        i++;                               // 첨자 증가
        ch = getchar();                    // 새로운 문자 입력
    }
    str[i] = '\0';                         // 입력된 문자열의 끝에 널 문자를 저장
}

  

입력 버퍼 지우기

scanf와 getchar 함수는 같은 버퍼를 사용하며 입력 데이터를 공유한다.

따라서 앞서 실행한 입력함수가 버퍼에 남겨둔 데이터를 그 이후에 수행되는 함수가 잘못 가져갈 가능성이 있다

따라서 버퍼에 남아 있는 불필요한 데이터는 미리 제거하는 것이 좋다.

→ 버퍼에 남아있는 문자들을 모두 입력해서 사용하지 않고 버리면 된다.

#include <stdio.h>

int main(void)
{
    int num, grade;             // 학번과 학점을 저장할 변수

    printf("학번 입력 : ");
    scanf("%d", &num);          // 학번 입력
    getchar();                  // 버퍼에 남아 있는 개행 문자 제거
    printf("학점 입력 : ");
    grade = getchar();          // 학점 입력
    printf("힉반 : %d, 학점 : %c", num, grade);

    return 0;
}


 

키워드로 끝내는 핵심 포인트

scanf 함수가 데이터를 입력할 때는 가장 먼저 버퍼의 상태를 확인한다.

버퍼에 저장되는 데이터의 끝에는 항상 개행 문자가 있다.

scanf 함수는 Crtl + Z를 누르면 EOF(-1)을 반환한다.

profile
디자인과 개발을 모두 할줄 아는 능력있는 개발자가 되고싶습니다.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN