사이먼's 코딩노트
[C언어] scanf 본문
[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 |