사이먼's 코딩노트

[C언어] scanf 본문

C언어

[C언어] scanf

simonpark817 2024. 2. 14. 10:07

[scanf]

  • 출력문을 사용하는 문법을 printf 라고 하면 키보드 입력을 위한 문법은 scanf이다.
  • C언어는 기본적으로 #include <stdio.h> 라는 헤더파일을 포함하고 이 때 stdio.h는 표준 입출력을 의미한다.
  • 아래는 scanf의 가장 기본적인 구조이다.
#pragma warning(disable: 4996)
#include <stdio.h>

int main() {
    int input;

    printf("정수를 입력해주세요. : ");

    scanf("%d", &input);

    printf("입력하신 수는 %d 입니다.\n", input);

    return 0;
}
  • 사용자가 키보드로 입력한 정수를 input에 넣어주는 일을 해주는 scanf는 일종의 외부 대행업체라고 생각할 수 있다.
  • scanf는 입력받은 값을 어디에 넣어줄 지 사용자에게 물어보고, 사용자는 해당 변수의 위치 즉, 주소를 넘겨줘야 한다.
  • 그렇기 때문에 scanf를 사용할 때는 서식 지정에 맞춰 변수를 넣는 것이 아니라 해당 변수의 주소값을 넘겨야한다.
  • 위 코드를 실행시키면 "정수를 입력해주세요. : " 의 출력문이 나오면 사용자는 정수 값을 입력하고, 해당 정수 값은 &input에 담기게 된다.

 

[문제]

  • 다음은 scanf와 배열을 이용해서 숫자 10개를 입력받아서 배열에 넣는 코드를 구현해보자.
  • 조건은 변수는 오직 2개만 사용할 수 있는 것이다.
#include <stdio.h>

int main(void) {

    int arr[10];
    int i;

    printf("=== 입력 ===\n");
    for(i = 0; i < 10; i++) {
        printf("%d번째 숫자를 입력해주세요 : ", i+1);
        scanf("%d", &arr[i]);
        // scanf("%d", (arr + i));
    }

    printf("=== 출력 ===\n");
    for(i = 0; i < 10; i++) {
        printf("%d번째 입력받은 숫자 : %d\n", i+1, arr[i]);
        // printf("%d번째 입력받은 숫자 : %d\n", i+1, *(arr+i));
    }

    return 0;
}
  • 조건에 맞춰서 변수는 arr와 i 두가지를 사용하였다. arr은 배열을 나타내기 위한 변수이고, i는 반복문 보폭에 사용될 변수이다.
  • 배열의 공간은 총 10개이고 각 배열에 사용자가 직접 정수를 입력하기 위해서 scanf를 사용하였다.
  • 이 때 배열문법을 이용하여 각 배열 주소를 표현하는 방법은 &arr[i] 이다. arr[i]이 각 배열의 값을 나타내기 때문에 해당 값을 가지고 있는 주소는 &을 붙혀 &arr[i]이 된다.
  • 반대로 배열문법이 아닌 포인터 참조 문법을 통해 주소를 표현하는 방법은 arr + i 이다. arr은 통상적으로 가장 첫번째 배열 값의 주소를 가르키기 때문이다.
  • 그렇게 각각 배열 주소를 통해 정수를 입력했으면 출력문을 통해서 각 배열의 값을 출력해야한다.
  • 배열문법을 이용하여 값을 출력하는 방법은 arr[i]이고 포인터 참조 문법을 통해 값을 출력하는 방법은 *(arr+i) 이다.

 

[문제 2]

  • 다음은 배열을 훼손하는 change라는 변수를 만들어보는 것이다.
#include <stdio.h>

void change(int* num) {
  *num = *num * 2;
}

void change2(int* p) {
    p[0] = 200;
    p[1] = 400;
}

int main(void) {
    int x[2];
    x[0] = 100;
    x[1] = 200;
    //int x[2] = {100, 200}; // 위 3 줄 코드의 같은 의미이다.

    printf("change 함수를 호출하기 전, x[0] : %d, x[1] : %d\n", x[0], x[1]);

    // 여기서 change 함수를 실행해주세요.
    change(&(x[0]));
    change(&(x[1]));

    change2(&x[0]);

    printf("change 함수를 호출하기 후, x[0] : %d, x[1] : %d\n", x[0], x[1]);
    // 출력 => change 함수를 호출하기 전, x[0] : 200, x[1] : 400

    return 0;
}
  • 필자는 change와 change2 두 가지 함수를 만들어보았다.
  • change 함수는 각각 배열의 있는 주소를 인자로 하여 매개변수를 포인터 변수로 받아 해당 값에 2를 곱하는 형식으로 함수를 정의했다.
  • change2 함수는 배열의 첫번째 주소를 인자로 하여 매개변수를 포인터 변수로 받아 첫번째 주소부터 차례대로 배열문법을 통해 해당 값을 변경해주는 형식으로 함수를 정의했다.
  • 이 외에도 각 배열에 있는 값을 변경해주는 함수는 여러가지 방법이 존재할 수 있다.
반응형

'C언어' 카테고리의 다른 글

[C언어] 공공재 / strcpy  (0) 2024.02.19
[C언어] define / typedef / 문자 배열  (2) 2024.02.19
[C언어] 배열  (2) 2024.02.08
[C언어] 다중 포인터  (0) 2024.02.06
[C언어] 포인터 문제풀이  (0) 2024.02.02