본문 바로가기
c언어

c언어 scanf()를 이용한 입력에 대하여 알아보기

by 개발자 L 2023. 2. 14.
반응형

c언어 scanf()를 이용한 입력에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 scanf()를 이용한 입력에 대하여 알아보도록 하겠습니다.

scanf()는 우리가 표준 입력을 할 때 어떤 형식을 지정해서 데이터를 입력을 받는 함수입니다.

기본적으로 우리는 형식 지정자를 입력하고, 그 형식 지정자에 대응이 되는 변수의 주소를 받아오는 방식으로

항상 입력을 받았습니다.

이번 포스팅에서는 scnaf()의 디테일한 기능들에 대하여 좀 더 자세히 알아보도록 하겠습니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 필드폭을 지정해서 읽기

우리가 형식 제어를 하는 문자열 내에 필드폭을 지정을 해놓으면

그 필드폭만큼의 문자를 읽어서 값으로 반환을 합니다.

이런 식으로 말이죠.

제가 코드를 직접 입력을 해서 보여드리도록 하겠습니다.

#include <stdio.h>

int main()
{
    int a, b;

    printf("6개의 숫자로 된 정수를 입려하세요 : ");
    scanf("%3d %3d", &a, &b);

    printf("입력된 정수는 %d, %d 입니다.\n", a, b);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

6자리의 정수를 입력해서 출력을 하는 함수인데,

입력 시에 필드폭을 지정을 해놓으면 어떤 식으로 출력이 되는지 결과를 보여드리도록 하겠습니다.

6개의 숫자로 된 정수를 입려하세요 : 123456
입력된 정수는 123, 456 입니다.

이런 식으로 3개씩 쪼개져서 나오는 것을 볼 수 있습니다.

만일에 필드폭을 지정을 하지 않았다면 변수는 하나만 있으면 되고,

6자리가 한 번에 붙어서 출력이 됩니다.

 

2. 8진수, 16진수 입력하기

우리가 제일 많이 쓰는 10진수뿐만 아니라, 8진수와 16진수도 입력을 할 수 있습니다.

이런 식으로 말이죠.

#include <stdio.h>

int main()
{
    int a, b, c;

    printf("3개의 숫자를 입려하세요 : ");
    scanf("%d %o %x", &a, &b, &c);

    printf("a = %d, b = %d, c = %d 입니다.\n", a, b, c);

    return 0;
}

이렇게 입력을 해봤고, 이제 어떤 식으로 결과가 나오는지 보여드리겠습니다.

3개의 숫자를 입려하세요 : 10 10 10
a = 10, b = 8, c = 16 입니다.

이렇게 결과가 나왔는데, 신기하게 나왔죠?
그 이유는 진수에 대응되는 수가 나왔기 때문입니다.

10은 진수 체계에서 자리가 바뀌는 숫자입니다.

제가 출력을 할 때 모든 수를 10진수 형태로 출력을 했기 때문에 이렇게 나온 것입니다.

그래서 a는 10진수이기 때문에 값이 그대로 나왔고,

b는 8진수이기 때문에 8의 배수마다 자리가 바뀌므로,

10을 입력했기 때문에 10진수로 변환하면 8이 나옵니다.

16진수 역시 16의 배수마다 자리가 바뀌므로,

10을 입력하게 되면 자리가 바뀌는 수가 되므로, 16이 출력됩니다.

반응형

 

3. 문자와 문자열 읽기

문자와 문자열을 읽을 때는 getchar()이나 gets_s() 함수를 많이 쓰지만,

scanf() 함수 역시 쓸 수 있습니다.

하지만 scanf()에 문자열을 입력하면 공백을 인식하지 못해서 문자열에 한해서는 gets_s() 함수를 쓰는 게 좋습니다.

그리고 여기서 주의를 할 점은 문자형 형식 지정자인 % c의 경우는 공백도 하나의 문자로 인식을 합니다.

하나의 예로, 두 개의 문자를 입력하는 scanf() 함수를 만든다 칩시다.

그럴 경우에 이런 차이가 생깁니다.

// 입력할 문자, x y
scanf("%c %c", &a, &b); // x y 입력
scanf("%c%c", &a, &b); // x와 공백 입력

 이렇게 되므로, 공백 처리를 잘해야 합니다.

아래는 문자형 형식 지정자의 종류를 표로 정리를 한 것입니다.

분류 형식 지정자 설명
문자형 %c char형 입력
%s 문자열 입력(공백이 아닌 문자부터 공백 앞 까지)
%[abc] 대괄호 안에 있는 문자들로만 이루어진 문자열 읽어들임
%[^abc] 대괄호 안에 있는 문자들만 제외하고 문자열 읽어들임
%[0-9] 0에서 9까지의 범위 내에 있는 문자들로 이루어진 문자열을 읽어들임

이제 이를 이용해서 간단한 코드를 한 번 짜보도록 하겠습니다.

#include <stdio.h>

int main()
{
    char c;
    char s[50], t[50];

    printf("공백으로 분리된 문자열을 입력하세요 : ");
    scanf("%s%c%s", s, &c, t);

    printf("입력된 첫 번째 문자열 : %s\n", s);
    printf("입력된 문장 : %c.\n", c);
    printf("입력된 두 번째 문자열 : %s\n", t);

    return 0;
}

제가 문자열과 문자의 차이를 보여드리기 위한 코드를 한 번 짜봤는데요,

이제 결과를 보도록 하겠습니다.

공백으로 분리된 문자열을 입력하세요 : hello world
입력된 첫 번째 문자열 : hello
입력된 문장 :  .
입력된 두 번째 문자열 : world

보시면 문자형은 공백을 인식을 한다는 것을 알 수 있고,

문자열은 공백을 기준으로 분리가 되어 입력되고 출력된다는 것을 볼 수 있습니다.

그래서 이를 한 번에 출력하려면 gets_s() 함수를 이용해서 문자열을 입력받는 게 좋습니다.

 

4. 문자 집합으로 읽기

이번에 할 건 문자를 하나의 집합으로 읽는 것입니다.

여기서 집합으로 읽는 것은 무언가를 분류하여 출력할 때 매우 편리한 기능을 가집니다.

그럼 제가 직접 코드를 작성해서 보여드리겠습니다.

#include <stdio.h>

int main()
{
    char s[50];

    printf("문자열을 입력하세요 : ");
    scanf("%[abc]", s);

    printf("입력된 문자열은 %s 입니다.\n", s);

    return 0;
}

이제 결과를 보여드리도록 하겠습니다.

문자열을 입력하세요 : abcdef
입력된 문자열은 abc 입니다.

이런 식으로 읽고 싶은 문자열만 읽을 수 있습니다.

 

5. scanf()의 반환값 이용하기

scanf()가 반환하는 값은 읽은 항목의 개수와 일치합니다.

그래서 이를 이용하여 사용자가 값을 몇 개나 입력을 했으며, 이게 잘 입력이 되었는지 확인할 수 있습니다.

제가 코드를 직접 짜서 보여드리도록 하겠습니다.

#include <stdio.h>

int main()
{
    int a, b, c;

    printf("정수들을 입력하세요 : ");

    if(scanf("%d %d %d", &a, &b, &c) == 3)
    {
        printf("정수들의 합은 %d 입니다.\n", (a + b + c));
    }

    else
    {
        printf("입력값이 올바르지 않습니다.\n");
    }


    return 0;
}

이런 식으로 제대로 자료형에 맞춰서 값이 입력이 되었는지 확인이 가능합니다.

그럼 결과를 보도록 하겠습니다.

// 올바른 값을 입력했을 경우
정수들을 입력하세요 : 1 2 3
정수들의 합은 6 입니다.

// 잘못된 값을 입력했을 경우
정수들을 입력하세요 : a b c
입력값이 올바르지 않습니다.

결과도 잘 나온 것을 확인할 수 있습니다.

여기까지 scanf()를 이용해서 여러 가지 입력을 하는 방법들에 대해 알아보았습니다.

다음 포스팅에서는 파링의 기초적인 부분들에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사합니다~

반응형

댓글