본문 바로가기
프로그래밍/C언어

4. c언어 scanf 문자 입력 받기, 형변환

by 수삼이는코딩중 2023. 1. 21.
728x90
문자 입력 받기

컴퓨터는 0과 1만 처리한다. 문자도 숫자로, 즉 0과 1로 처리한다. 그래서 단지 이것을 char, 즉 문자형으로 사용할 것이냐, int형, 즉 정수형으로 사용할 것이냐는, 포맷으로 달라진다.

#include <stdio.h>
int main() {
	char a = 'a';
	printf("a's value=%d, a's char=%c\n", a, a);
	return 0;
}

결과는 다음과 같다
a's value=97, a's char=a

%d는 a의 값을 십진수로 출력하라는 뜻이다.
%c는 a의 값을 문자로 출력하라는 뜻이다.
a는 문자인 'a'로 저장되었지만 포맷에 따라 정수형과 문자형으로 출력 되었다.

ASCII 코드 : 문자와 숫자의 대응표. 1byte (8bit) 로 문자들을 표현했다.
Unicode : 한 문자를 1-4 바이트까지 다양한 길이로 처리한 code.

입력함수

scanf()

키보드로부터 결과를 받아들이는 입력함수
엔터를 눌러야 입력으로 처리된다. (단어 여러개를 따로 입력해야 한다면 엔터로 구분한다)
변수의 타입마다 입력받는 포맷을 달리한다.
int : %d
double : %lf(엘에프)
float : %f
char : %c
short : %hd
long : %ld(엘디)

#include <stdio.h>
int main() {
	char a;
	printf("문자를 입력하세요\n");
	scanf("%c", &a);
	return 0;
}

결과출력 방식
"문자를 입력하세요" 라는 질문이 뜬다.
아무 문자를 입력하면 문자형 변수 a 에 저장되고, %c포맷에 따라 그 문자가 입력된다.


형변환

#include <stdio.h>
int main() {
	int a;
	double b;

	b = 2.4;
	a = (int)b;

	printf("%d", a);
}

결과는 다음과 같다
2

실수형 변수b에는 2.4 라는 값이 저장되어 있다.

a =(int)b;

형변환을 하려면 다음과 같이 괄호안 에 변경하고자 하는 문자형을 입력하고 변수 앞에 적어주면 된다.

(바꾸려는 형) 변수

그러면 a에는 b의 정수부분인 2가 저장된다. 다만 본래의 b는 변하지 않는다.

두 수의 비율

#include <stdio.h>
int main() {
	int a, b;
	float c, d; 

	printf("두 숫자 입력 : ");
	scanf("%d %d", &a, &b);

	c = a / b;
	d = (float)a / b;

	printf("두 수의 비율 : %f %f", c, d);
	return 0;
}

a 에 5, b에 2를 입력하면 결과는 다음과 같다.
두 수의 비율 : 2.000000 2.500000

먼저, a와 b에는 정수형 숫자가 입력 되었다.

c = a/b;

따라서 a/b는 몫인 2만 출력하여 변수 c에 저장되었다.

만약에 a나 b둘 중 하나의 변수가 실수형이라면?

d = (float)a / b;

a를 float로 형변환 하여 b로 나눈 것이다.
컴퓨터는 연산값을 더 큰 자료형에 맞춘다. 따라서 a/b는 실수형인 2.500000으로 출력되었다.

문제 1

임의의 실수에서 소수점 이하 두자리수만 추출하여 정수형 변수에 대입하라. 예를들어 사용자로부터 입력받은 실수 f 가 12.3456이라면 34만 추출한다. 이때 반올림은 고려하지 않아도 상관없다. f 가 달러 단위의 화폐 액수라고할 때 센트 단위만 추출해내는 경우라고 생각하면 된다. 다음 ???? 자리에 적합한 연산식을 작성하는 문제이다.

printf("실수를 입력하시오 : ");
scanf("%f", &f);
i = ? ? ? ? 
printf("i=%d\n", i);

이 문제의 핵심은 음수이거나 소수점 이하의 자리수가 없는 경우까지 잘 고려하여 항상 잘 동작하는 코드를 만드는것이다.

예시답안

#include <stdio.h>
int main() {
	float f;
	int i;
	printf("실수를 입력하시오 : ");
	scanf("%f", &f);
	
	i = (f > 0)? (f - (int)f) * 100 : -1*((f - (int)f) * 100);
	
	if (i==0) {
		printf("i = 00");
		return 0;
	}

	printf("i=%d\n", i); 
	return 0;
}

댓글