• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

형식지정자

22.02.18 16:29 작성 조회수 284

2

형식 지정자는 항상 헷갈리네요 ㅠ...

선생님께서 풀이하실 때 int c를 출력할 떄에 "%c"<문자 형식 지정자를 쓰시더라구요 

현재까지 배운 바로는 데이터의 자료형(실수형/정수형인지..)이나 데이터의 크기가 일치하면 바람직한 문장이라는 것은 이해했습니다.

그런데 혼용되는 것들이 너무 헷갈립니다.

예를들어 printf의 경우 작은 범위의 숫자들 끼리는 int나 char을  바꾸어서 써도 정상적으로 출력이 되더군요

그런데 또 scanf를 살펴보니

int b;

scanf(" %c", &b);

이를 실행해 봤을때 문자 'A'를 넣으면 'A'(65)의 아스키 코드 값을 b에 저장할 줄 알았는데 저장도 안되더라구요...

그 반대로 

char a;

scanf("%d", &a);

여기에 65를 넣으니 char a는 'A'로 정확히 뜨구요..

그래도 print문은 이해는 되는 편입니다.

가령 선생님의 풀이에서도 int c 는 정수형이고 "%c"도 정수형인 char의 형식 지정자이고 숫자의 범위도 %c로 커버가 가능 하기에 정상적으로 출력이 된 점은 이해가 갑니다

 

근데 scanf는

int b;

scanf(" %c", &b);에서 char 자료형보다 큰 int 자료형에 숫자를 %c로 저장하는데 더 넉넉한 공간임에도 저장이 안되고

 

char a;

scanf("%d", &a);에는 마치 정수 자료형으로 읽어들여서 char에 쑤셔넣는 것 같은데 정상적으로 입력이 되더라구요... 왜이런가요ㅠ

제가 너무 과하게 들어갔나요?이게 형식지정자가 맞는듯 안맞는듯 해설같은 데에서도 교묘하게 다르게 사용이 되다보니 헷갈려서 질문드립니다..

답변 1

답변을 작성해보세요.

4

강민철님의 프로필

강민철

2022.02.18

안녕하세요 :)

 

답변에 앞서 말씀드리자면, 과한 질문이 아닙니다 :)

하나하나 짚고 넘어가시려는 모습이 오히려 정말 멋집니다!

지금은 답답한 마음이 들 수 있겠으나,

앞으로 누구보다도 멋진 개발자가 되실 것 같아요 :)

 

우선, 이것부터 말씀드려야 할 것 같아요. '사람'이 이해하는 코드와

'컴퓨터'가 이해하는 코드는 다릅니다.

예를 들어,

"%c는 문자를 위한 형식지정자야!"

"%d는 정수를 위한 형식지정자야!" 같은 말은 '사람' 입장에서 코드를 바라볼 때 하는 이야기입니다.

컴퓨터 입장에서 바라보는 코드는 그냥 0과 1입니다. 문자(아스키코드)는 그냥 정수에 문자를 대응시킨 숫자에 불과하지요.

이 부분에서 헷갈리는 포인트가 생긴 듯 합니다. 그렇기에 c언어에서 어떤 형식지정자로 출력할 것인지를 비롯해 데이터를 다룸에 있어서는 "데이터의 크기"를 기준으로 생각해보기를 권장합니다.

"printf의 경우 작은 범위의 숫자들 끼리는 int나 char을  바꾸어서 써도 정상적으로 출력이 되더군요"

라고 하셨는데,

printf가 숫자를 인식할 적에 이를 %c로 출력하면 아스키코드에 대응되는 숫자로 인식하고

%d로 출력하면 정수 숫자로 인식하기 때문에 당연히 전자는 문자가 출력되고 후자는 정수 숫자가 출력됩니다.

 

scanf로 입력 받을 때에도 마찬가지입니다. 아래 코드를 보세요.

이 코드에서 A를 입력하면 A가 정상적으로 출력 됩니다. (직접 돌려보세요^^)

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> 

int main() {
	
	int b;
	scanf("%c", &b);
	printf("%c", b);

	return 0;
}

그런데 아래 만일 printf가 아래와 같다면 코드는 정상적으로 출력되지 않습니다.

printf("%d", b);

 

왜 그러냐면,  int형 크기(4바이트)의 변수로 선언하여 문자(1바이트)형식으로 입력받았는데,

그걸 int형 크기(4바이트)로 출력하기 때문입니다. 나머지 크기, 즉 3바이트는 쓰레기값이 담기겠죠.

 

1바이트 크기의 문자를 입력받고 그걸 정수로 출력하기 위해서는

1바이트 크기의 정수로 출력해야겠죠.

int는 4바이트, short int는 2바이트, short short int는 1바이트이죠?

short short int 형으로 출력하는 형식 지정자는 아래와 같습니다. 

printf("%hhd", b);

 

따라서, 아래와 같은 코드는 정상적으로 동작합니다.

 

이번에는 질문 주신 두 번째 코드도 봅시다.

char a;
scanf("%d", &a);

 

char형 크기(1바이트)의 변수로 선언하여 정수(4바이트)만큼 입력받았는데,

그걸 char형 (1바이트)의 변수로 출력합니다.

 

다만, scanf나 printf를 사용할 때 여러 형식 지정자를 혼용하여 사용하는 것이 혼란스럽다면,

그냥 선언해준 변수의 형식에 맞게 입출력하는 것을 추천합니다.

앞서 보여드린 예제의 경우 문제가 없는 것처럼 보여도 

컴파일러에 따라 아래처럼 경고나 오류를 띄우기도 하기 때문입니다.

(실제로도 자료형을 혼용하여 입출력하는 것은 가독성이 떨어지고 위험하기 때문에 잘 사용하지 않습니다)

 

 

 

 

답변이 되었길 바랍니다.

감사합니다 :)

너무 너무 감사합니다,