/* 문자를 저장하는 변수 */
#include <stdio.h>
int main() {
char a;
a = 'a';
printf("a의 값과 들어 있는 문자는? 값 : %d, 문자 : %c \n", a, ,a );
return 0;
}
1.
char a;
char형 변수를 선언
2.
a = 'a';
이 부분은 a라는 변수에 문자 a를 대입. 이때, 모든 문자들은 모두 작은 따옴표로 묶어주어야함. 만약 묶지않고
a = a
로 그냥쓰면, a가 변수 a라고 착각하여 변수의 값을 a라는 변수에 대입하는 문장으로 인식. 따라서 a에는 아무런 값이 들어있지않은 쓰레기 값이 되어 나중에 a라는 문자를 출력해 보았을때, 이상한값이 나오게됨. 문자를 대입한느것도 숫자를 대입하는것과 동일하다.
3.
printf("a 의 값과 들어 있는 문자는? 값 : %d, 문자 : %c \n", a, a, );
%d는 a의 값을 (정수인 10진수) 라고 출력하라는 뜻입니다.
%c는 a의 값을 문자로 출력하라는 뜻입니다.
숫자로 출력하라는 a값의 아스키 코드표
아스키코드의 변화
1. 아스키코드 7비트 데이타 ( 0 ~ 127까지표현)
-> 문자의 확장이 필요해짐
2. 확장된 아스키코드 1비트추가된 8비트 데이타(256가지 표현)
-> 문자의 확장이 필요해짐
3. 유니코드 2바이트 (65536가지 문자처리)[ 대부분의 언어의 문자체계를 모두 표시하고도 2만개 가량 더대응 할수있음]
/* 섭씨온도를 화씨로 바꾸기 */
#include <stdio.h>
int main() {
double celsius ; //섭씨온도
printf(" 섭씨 온도를 화씨 온도로 바꿔주는 프로그램 입니다. \n");
printf(" 섭씨 온도를 입력해 주세요 : ");
scanf("%lf", &celsisus); //섭씨 온도를 입력 받는다.
printf(" 섭씨 %f 도는 화씨로 %f 도 입니다. \n", celsius, 9 * celsius / 5 + 32);
return 0;
}
4.
double celsius; // 섭씨온도
celsius라는 double형 변수를 선언하였습니다. 변수의 이름을 종전의 a,b에서 celsius라고 한 이유는 좀더 이해하기 편하기때문입니다.
5.
scanf("%lf", &celsius);
scanf 는 화면(키보드)로 부터 결과를 받아들이는 입력함수 입니다.
흔히 printf와 scanf 를 가르켜 입출력 함수라고합니다. 이 때, scanf 함수는 우리가 어떠한 입력을 하기 전까지 계속 기다립니다.
또한, 입력을 할 때 엔터를 눌러야지만 입력으로 처리됩니다.
scanf와 printf 는 이름도 비슷한데, 사용하는 방법도 비슷합니다. printf에서 각 변수를 출력할 포맷 (%d, %f, %c등) 변수마다 다르게 하는것처럼 scanf도 각 변수의 타입마다 입력받는 포맷을 달리합니다.
double형 변수를 입력받으려면 %lf(소문자lf, if가아님)로 해야합니다. printf보다 까다로운점은 printf 는 double이나 float 모두 %f로 출력가능하지만 float는 %f 로 무조건 입력 받아야 한다는 점입니다.
마찬가지로 double 형 변수도 무조건 %lf로 입력 받아야합니다. 그외에도 printf 는 정수 형 변수는 모두 %d로 출력가능했던 반면에 scanf 는 각 자료형마다 포맷이 모두 정해져있습니다.
6.
printf("섭씨 %f 도는 화씨로 %f 도 입니다. \n", celsius, 9*celsius / 5+32);
곱셉과 나눗셈의 우선순위가 높으므로 9*celsius/5가 먼저 계산된후 32가 더해지므로 위의식과 일치합니다. 따라서 결국
printf 의 두번째 %f 부분에는 위 계산된 화씨의 값이 들어가게 됩니다.
/* scanf 총 정리 */
#include <stdio.h>
int main() {
char ch; //문자
short sh; //정수
int i;
long lo;
float fl; // 실수
double du;
printf("char 형 변수 입력 : ");
scanf("%c", &ch);
printf("short 형 변수 입력: ");
scanf("%hd", &sh);
printf("int형 변수 입렵 : ");
scnaf("%d", &i);
printf("long 형 변수 입력: ");
scanf ("%ld", &lo);
printf("float형 변수 입력 : ");
scanf("%f", &fl);
printf("double 형 변수 입력 : ")
scanf("%lf", &du);
printf("char : %c, short : %d, int : %d" ,ch, sh, i);
printf("long : %d, float : %f, double : %f \n",lo, fl, du);
return 0;
}
7.
printf("char 형 변수 입력: ");
scanf("%c", &ch)
한글은 2바이트를 차지하기 때문에 최대 1바이트를 차지하는 char 형 변수인 ch에 한글을 치면 오류가난다.
이와같이 허용된 메모리 이상에 데이터를 집어넣어 발생하는 오류를 버퍼 오버플로우(Buffer Overflow)라고 하며 보안상 매우 취약하다.
뿐만 아니라 근처의 데이터가 손상됨에 따라 큰 문제가 발생할수도있다. 따라서, 버퍼 오버플로우가 일어나지 않게 허용된 데이타 이상을 집어넣었는지 안집어 넣는지 검사할 필요성이 있음.
또한 앞으로 우리가 char형 변수를 선언할때에는 '이 사람이 문자를 보관하는 변수를 선언하는구나'라고 생각하도록하자.
왜냐하면 보통 수 데이타를 보관하는 변수로 int를 쓰지 char을 잘 쓰지도 않을뿐더러 char 이름도 character에서 따왔을만큼 문자와 무언가 관련이 있기 때문이다.
문제 1
앞서 섭씨를 화씨로 바꿀때 9* celcius / 5 + 32 라고 하엿습니다. 만약에 이를 9 / 5*celcius+32로 바꾸면 결과가 달라질까요?
문제풀이
ex) celcius = 10
(9*10/5) +32 [괄호는 계산우선순위에 따라친것]
= 50
(9/5*10) + 32 [괄호는 계산우선순위에 따라친것]
= 50