업데이트:

태그: ,

카테고리:



char

c언어에서는 정수 자료형인 char을 이용해 문자 한 개를 저장한다.

char는 1byte, 8bit만큼의 크기를 갖는 자료형이다.

따라서 범위가 -128 ~ 127까지, 256개의 숫자를 나타낼 수 있다.

/* 문자를 저장하는 변수  */
#include <stdio.h>
int main() {
  char a;
  a = 'a';

  printf("a 의 값과 들어 있는 문자는? 값 : %d , 문자 : %c \n", a, a);
  return 0;
}
a의 값과 들어있는 문자는? 값 : 97 , 문자 : a

이렇게 출력이 나오는 것을 볼 수 있다.

문자를 변수에 할당할때는, 홑문자는 작은따옴표 '로, 문자열은 큰따옴표 "로 묶어줘야한다.

%c

%c라는 출력형식이 나오는데, 이 출력형식은 파라미터로
문자가 들어오면 문자 그대로를 반환하고,
정수라면 파라미터를 ASKII 코드표에 해당하는 값에 대입해 문자로 바꿔준다.

다른 예시로

#include <stdio.h>
int main() {
    char b;
    b = 123;
    printf("b의 값과 들어있는 문자는? 값 : %d 문자 %c :",b,b);
}
b의 값과 들어있는 문자는? 값 : 123 문자 : {

이렇게 %c는 파라미터로 들어오는 값에 따라 다른 출력을 할 수 있다.

최근에는 유니코드라는 새로운 문자 체계를 도입해 다양한 언어, 문자들을 추가한다.



scanf

유저에게 문자열을 입력받을 수 있다.

#include <stdio.h>

int main() {
	double celsius;

	printf("섭씨 온도를 화씨 온도로 바꿔주는 프로그램\n");
	printf("섭씨 온도를 입력해주세요:");
	scanf("%lf", &celsius); /*온도 입력*/
	printf("섭씨 %f 도는 화씨 %f 도 입니다.", celsius, 9.0 / 5.0 * celsius + 32);

	return 0;
}

double celsius; 여기서 celsius라는 변수가 double형으로 선언된 것을 볼 수 있다.

scanf("%lf", &celsius); /*온도 입력*/이 코드를 보면 출력 형식에 %lf가 있는데, double형의 데이터를
입력받을 때는 %lf로 포맷을 설정해줘야한다.

float과 double의 경우, printf에서 출력 포맷으로 모두 %f를 사용할 수 있는데,
scanf로 float을 입력받을 때는 %f, double을 입력받을때는 %lf로 받아야한다는 것이다.


입출력 포맷이 다른 경우

출력받을때와 입력받을때 포맷이 각각 다른데,

short형은 %hd
long형은 %ld
double형은 %lf로 입력받는 것이 특징이다.


버퍼오버플로우

올바른 형식의 데이터를 입력받지 않았을떄, 예시로 char형 변수에 한글을 입력받으면 허용된 메모리 이상에 데이터를 집어넣게된다.
이때 발생하는 오류가 버퍼 오버플로우이고, 이는 보안 상 매우 취약하고, 데이터가 손상되어 문제가 발생할 수 있다.
그래서 사용자의 입력을 항상 검사해야한다.


다른 문제

위의 섭씨 프로그램에서 숫자들이 9.0과 5.0으로 표현된 이유는
9 / 5 를 그냥하면 정수형끼리 나눠진것으로 프로그램이 이해하고 나머지는 버려져 1만 남기 때문이다.

댓글남기기