2017년 1월 2일 월요일

05. 입력

05. 입력

기본적인 입력

가장 기본인 정수 하나를 입력받아 출력하는 예제는 다음과 같습니다. 이때 scanf함수를 사용합니다.
#include <stdio.h>

int main(void)
{
    int num;
    scanf("%d", &num);
    printf("%d", num);

    return 0;
}
결과
3
3



1) &가 붙는 이유

scanf함수의 형태

scanf("%d", &num);의 의미는 앞에서 배운 printf함수와 비교해보았을 때 num에 %d형태(정수형태)값을 넣는다는 것임이 분명합니다.
그런데 어째서 num앞에 &를 붙이는 것일까요?

&의 의미

변수 이름 앞에 &를 붙이면 그 변수의 주소를 알려줍니다.
이를 이해하기 위해서는 먼저 변수들이 어떻게 저장되는지 알아야겠지요.
주소
00004
00016
000213
00036
00042
만약 변수 A의 값이 6이고 0001에 저장되어 있다면
연산
&A0001
이 됩니다.
즉, &는 변수가 어디에 저장되어 있는지를 나타내는데, 어째서 printf함수는 변수의 값만 필요하지만 scanf는 변수의 주소가 필요할까요?

scanf가 변수의 주소를 받는 이유

만약 scanf에 num이라는 변수를 넘겨주었다면, scanf는 num이라는 변수 자체를 사용하는 것이 아닙니다.
scanf내부에 다른 변수를 선언해서 그 변수에 num값을 대입하고, 대입한 값을 이용해 변수를 출력합니다.
이렇게 하는 일차적인 이유는 scanf내에서 출력을 위해 num값을 이리저리 바꾸다 보면 문제가 생길 수 있기 때문입니다.
예를 들어 n을 입력하면 n+1을 출력하는 함수 add()라는 게 있다고 생각해봅시다.
int num = 3;
int result = add(num);
printf("num = %d, result = %d", num, result);
(경우1) add함수가 변수의 값을 받아 사용하는 경우의 결과
num = 3, result = 4
(경우2) add함수가 변수를 직접 사용하는 경우의 결과
num = 4, result = 4
프로그램을 작성하는 사람 입장에서는 당연히 (결과1)을 생각할 수 밖에 없습니다.
add()함수 내부에서 num값이 어떻게 바뀔 지 알 수도 없구요.
따라서 C언어에서 함수에 값을 줄 때, 그 변수의 값만을 사용하게 하는 것입니다.
하지만 경우에 따라 num의 값을 실제로 바꾸어야 할 수 있는데, 이 경우 변수의 주소를 값으로 넘겨주어 처리합니다.
그러면 함수가 직접 변수가 저장된 곳에 접근해서 변수의 실제 값을 바꿀 수 있습니다.
그렇기에 scanf는 변수의 주소값을 인자로 받는 것입니다.



2) 구분자

여러 변수 입력하기

한 번에 두 개의 변수를 입력받고 싶으면 이렇게 할 수 있습니다.
int price1, price2;
printf("가격을 두 개 입력하세요: ");
scanf("%d %d", &price1, &price2);
printf("%d원과 %d원의 합은 %d원입니다.\n", price1, price2, price1 + price2);
결과
가격을 두 개 입력하세요: 1200 2300
1200원과 2300원의 합은 3500원입니다.
이 경우 1200과 2300의 사이에 공백을 하나 넣어 두 개의 값을 구분한 것을 볼 수 있습니다.

구분자

위 예제에서 두 입력을 구분한 공백과 같은 것을 구분자라고 합니다.
예를 들면 다음과 같이 구분자를 사용할 수도 있습니다.
int num1, num2, num3;
printf("3개의 정수를 덧셈으로 입력하세요: ");
scanf("%d+%d+%d", &num1, &num2, &num3);
printf("%d+%d+%d = %d입니다.", num1, num2, num3, num1+num2+num3);
결과
3개의 정수를 덧셈으로 입력하세요: 3+5+7
3+5+7 = 15입니다.
또한 구분자를 반드시 한 가지만 사용해야 하는 것 또한 아니기 때문에 여러 구분자를 적절히 사용할 수도 있습니다.



댓글 없음:

댓글 쓰기