[C언어 강좌] #4-1 scanf로 입력받기


안녕하세요 파일입니다. 즐거운 금요일이네요 ^^

제가 요즘 피곤하고 바빠서 글을 많이 못썼습니다.. (스스로 반성 ㅎㅎ..)

 

저번 시간에 변수와 printf에 대해 배웠습니다. 출력을 했으니.. 이제 사용자가 입력을 하는 것도 해봐야겠죠?

그럴 때 사용하는 것이 바로 scanf인데요.

 

왜 scan이 아니라 scanf인 것은 저번 강의를 제대로 들었다면 아시겠죠. f 가 Formatted 즉 서식화의 약자입니다.

scanf 역시 printf 와 같은 곳인 stdio.h 에서 선언이 되었으므로 전처리기로 똑같이 선언하시면 되겠습니다 ^^

 

100번 설명보다 1번 예제가 나으니 바로 들어가겠습니다.

#include <stdio.h>

int main(){
	int num = 0;
	printf("숫자를 입력해주세요 : ");
	scanf("%d", &num);
	printf("입력받은 수 : %d", num);
}

숫자를 입력해주세요 : 100
입력받은 수 : 100
--------------------------------
Process exited after 0.5087 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

숫자를 입력받으면 그 숫자롤 출력하는 프로그램을 만들어봤습니다.

이 프로그램에서 입력의 핵심은 scanf("% d", &num); 이 부분에 있습니다.

% d는 서식 문자인데 printf에서도 배웠듯 정수를 출력할 때 사용하는 서식 문자입니다.

scanf에서 사용하면 입력받는 값이 정수라는 의미가 되고요.

 

scanf를 쓰면 커서가 생기는데 printf에서 입력 가독성을 위해 공백을 뒀습니다.

 

#include <stdio.h>

int main(){
	int num = 0;
	printf("숫자를 입력해주세요 : ");
	scanf("%d", &num);
	printf("입력받은 수 : %d", num);
	printf("변수의 메모리주소 : %x", &num);
}

숫자를 입력해주세요 : 100
입력받은 수 : 100변수의 메모리주소 : 62fe1c
--------------------------------
Process exited after 0.4685 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

그걸 num에 저장하는데 & 이건 왜 붙을까요?

변수 이름 앞에 &을 붙이면 그 변수의 메모리 주소가 나오는데요.

 

택배기사가 A라는 사람의 이름을 알아도 주소를 모르면 보낼 수 없듯이

scanf를 이용해 변수에 값을 저장할 땐 꼭 변수 이름 앞에 &를 붙여주셔야 합니다.

위에 예제를 실행해주시면 num 값의 메모리 주소를 알 수 있습니다. (16진수로 출력)

 

사실 그냥 변수 이름 입력하면 바로 저장되게 해 놨으면 좋았을 건데.. 일단 받아들입시다.

그럼 한번 삼각형의 넓이를 구하는 프로그램을 제작해보겠습니다.

 

 

#include <stdio.h>

int main(){
	int height = 0;
	int width = 0;
	printf("높이를 입력해주세요 : ");
	scanf("%d", &height);
	
	printf("밑변을 입력해주세요 : ");
	scanf("%d", &width);

	printf("삼각형의 넓이는 %d 입니다.", height * width * 0.5);
	return 0;	
}

높이를 입력해주세요 : 10
밑변을 입력해주세요 : 10
삼각형의 넓이는 0 입니다.
--------------------------------
Process exited after 1.858 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

어.. 뭔가 이상하네요 왜 값이 0이 나올까요??

이유는 마지막 줄에 있습니다. 삼각형의 넓이 공식은 초등학교 때 배우니 생략하고..

정수 값에 0.5를 곱했으니 전체적인 값은 실수입니다. 그런데 그것을 % d로 출력하니 정수부(0)만 출력이 된 것이죠.

 

원하는 값 출력을 위해선 실수 서식 문자 형태로 출력해야겠죠 ^^?

 

#include <stdio.h>

int main(){
	int height = 0;
	int width = 0;
	printf("높이를 입력해주세요 : ");
	scanf("%d", &height);
	
	printf("밑변을 입력해주세요 : ");
	scanf("%d", &width);

	printf("삼각형의 넓이는 %f 입니다.", height * width * 0.5);
	return 0;	
}

높이를 입력해주세요 : 20
밑변을 입력해주세요 : 10
삼각형의 넓이는 100.000000 입니다.
--------------------------------
Process exited after 1.144 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

 

원하는 값이 잘 나왔습니다.

그리고 추가로 저번 강의인 변수 편에서 변수 이름을 의미 있게 지으라고 했듯 변수 이름은 알아보기 쉽게

작성하는 것이 좋습니다 (이 경우에선 높이와 밑변)

#include <stdio.h>

int main(){
	int num = 0;
	printf("숫자를 입력해주세요 : ");
	scanf("%d", &num);
	printf("10진수 : %d  16진수 : %x  8진수 : %o", num, num, num);

}


숫자를 입력해주세요 : 10
10진수 : 10  16진수 : a  8진수 : 12
--------------------------------
Process exited after 0.6968 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

이 소스코드는 10진수를 입력받고

각각 10진수, 16진수, 8진수로 출력하는 코드입니다.

사실 scanf는 간단한 게 앞에서 printf를 잘 들었다면 

입력받을 때 사용하는 서식 문자 방식이 똑같기 때문에 어렵지 않습니다.

 

#include <stdio.h>

int main(){
	float f1, f2;
	double d1, d2;
	
	printf("실수를 2개 입력해주세요(float) : ");
	scanf("%f %f", &f1, &f2);
	printf("%f %f \n", f1, f2);
	
	printf("실수를 2개 입력해주세요(double) : ");
	scanf("%lf %lf", &d1, &d2);
	printf("%f %f", d1, d2);

}

실수를 2개 입력해주세요(float) : 1.3 4.5
1.300000 4.500000
실수를 2개 입력해주세요(double) : 5.5 9.9
5.500000 9.900000
--------------------------------
Process exited after 4.354 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

float와 double 값 2개를 각각 입력받고 출력하는 예제입니다.

printf처럼 scanf 도 서식 문자를 여러 개 사용하여 입력값을 한꺼번에 받을 수 있습니다.

 

그리고 printf는 double 값을 출력할 때 % f를 쓰던 % lf를 쓰던 상관없지만

scanf로 double 값을 입력받을 땐 꼭 % lf를 써야 합니다 *Long double 일 땐 % Lf임

이 부분에 관해서는 추가로 설명하겠습니다. 

 

 


scanf는 여기까지입니다. 별로 어렵지 않죠 ^^? 

다음편에선 상수에 대해 알아보겠습니다. 감사합니다.

COMMENT WRITE