입력 함수 scanf
형식 : scanf("형식 지정자", 변수의 주소);
# include <stdio.h> // scanf, printf 함수을 포함하고 있는 헤더 파일
int main()
{
int a;
char b;
double c;
float d = 1.1;
printf("%d %c %f %f\n", a, b, c, d);
scanf("%d %c %lf %f", &a, &b, &c, &d);
printf("%d %c %f %f", a, b, c, d);
return 0;
}
/*************** 결과 ****************
0 0.000000 1.100000
1 a 15.6 17.9 (를 입력하면)
1 a 15.600000 17.900000 (이 출력된다)
************************************/
scanf는 변수를 선언한 다음 사용할 수 있고, 일반적으로 초기화를 하지 않은 상태에서 입력을 받지만 초기화를 한 변수에 대해서도 값을 덮어씌울 수 있다. 변수를 선언한다는 것은 메모리 전체에서 특정 부분에 해당 변수를 위한 메모리 공간을 마련해주는 것이기 때문에, 선언을 해주지 않으면 해당 변수에 값을 담을 수도 없기 때문이다.
살짝 의문이 드는 점이 있는데, C언어는 garbage collector가 없어서 초기화를 하지 않고 선언만 해준 경우 garbage value가 담겨야 정상인데 어떤 이유에서인지 선언한 이후 a와 c의 변수에는 0의 값이 저장되어 있는 것을 볼 수 있다. 에디터에 따라 다른 걸까? 잘 모르겠다. 아무튼 초기화하지 않은 값은 쓸 일이 없으므로 일단은 넘어가도 좋을 문제다.
아무튼! scanf 함수를 이용하면 표준 입력을 통해 하나 이상의 변수에 값을 입력해줄 수 있다. printf와 매우 비슷하게 생겼지만, 형식 지정자를 넣고 큰 따옴표를 닫고 쉼표를 한 이후 변수명이 아니라 변수의 주소를 써줘야 한다는 것이다. 일반적으로 변수의 주소는 주소 연산자 & 를 이용하여 표현해준다. & 뒤에 변수명을 적어주면 해당 변수가 저장되어 있는 주소를 의미한다.
# include <stdio.h>
int main()
{
char arr[6];
printf("문자열을 입력하세요 : ");
scanf("%s", arr);
printf("%s", arr);
return 0;
}
/********** 결과 ***********
문자열을 입력하세요 : hello
hello
***************************/
scanf로 배열 형태의 문자열을 입력받을 수도 있다. 다만 위에서 다뤘던 일반적인 자료형이랑은 다르게 문자열은 고려할 부분이 많다.
우선, char 자료형 배열을 원하는 글자수+1 만큼의 크기로 선언해준다. 문자열의 끝나는 지점을 알려주기 위해 마지막에 NULL이 오기 때문에, 배열의 끝에는 NULL값이 올 수 있도록 1칸을 여유롭게 확보해줘야 한다. 참고로 선언한 배열의 크기 중 일부만 쓰고 나머지 공간이 남는다면 전부 NULL값이 들어가게 되는데 이렇게 되면 메모리 공간이 낭비되는 셈이다. 그래서 해당 배열에 얼마만큼의 메모리 공간을 잡아둬야 할지 모르는 문제를 극복하기 위해 동적 메모리 할당 malloc을 쓰는 것이 좋다.
또한, 배열은 그 자체로 포인터의 역할을 하기 때문에 위에서 말했던 형식과는 약간 다른 형식으로 scanf 함수를 써줘야 한다. 변수의 주소를 쓰기 위해 이용했던 주소 연산자 &를 쓰지 않고 배열명만 입력하는 형태로 말이다. 배열은 그 자체가 주소이므로 &를 써줄 필요가 없다.
# include <stdio.h>
int main()
{
char arr1[20];
char arr2[20];
printf("첫 번째 문자열 입력 : ");
scanf("%[^\n]s", arr1);
printf("첫 번째 배열 출력 : %s\n\n", arr1);
printf("두 번째 문자열 입력 : ");
scanf("%s", arr2);
printf("두 번째 배열 출력 : %s", arr2);
return 0;
}
/************ 결과 *************
첫 번째 문자열 입력 : hello world
첫 번째 배열 출력 : hello world
두 번째 문자열 입력 : hello world
두 번째 배열 출력 : hello
*******************************/
입력하는 문자열에 공백이 존재할 경우, 공백 직전의 글자까지만 받고 저장한다. 만약 공백까지 포함하고 싶다면 형식 지정자를 "%s"가 아닌 "%[^\n]s"로 써줘야 한다.
Source
2. C언어 코딩 도장: 40.1 입력 값을 배열 형태의 문자열에 저장하기
'Dev > C' 카테고리의 다른 글
[C언어] 함수 매개변수 앞에 const? (0) | 2020.10.20 |
---|---|
[C언어] 코드로 알아보는 산술 연산자 (0) | 2020.06.26 |
[C언어] 변수와 자료형, 그리고 상수 (0) | 2020.06.20 |
[C언어] 문자 자료형과 아스키 코드(ASCII) (1) | 2020.06.19 |
[C언어] 실수형 변수 출력 시 소수점 자릿수 조절 (반올림/올림/내림) (0) | 2020.06.17 |