PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2017/12/22 07:07:44
Name 이은영
File #1 캡처.PNG (11.3 KB), Download : 19
Subject [질문] C언어 초보질문입니다.


6번째 줄에서 int 를 char 로 변경하고 17이라고 입력을 하면
청소년 관란 불가 라는 메세지가 뜨긴 하는데 에러창이 하나 뜹니다.

비주얼 스튜디오 2017로 돌리면
서식 문자열 '%d'에 'int *' 형식의 인수가 필요하지만 variadic 인수 1의 형식이 'char *'입니다.
라고 나옵니다.

여기서 표현범위가 더 작은 char나 short를 써도 상관없지 않나요?
배운걸 다시 생각해봤는데 char 랑 short는 문자 아스키 코드의 문자를 저장할 때 사용한 것 같았는데
char num1 = 1;
char num2 = 2;
char num3 = num1 + num2;

printf("%d", num3);

return 0;
이런식으로 코드를 짜서 다시 돌려보면 에러가 없습니다.
무슨 차이가 있어서 에러가 나는걸까요?

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
파란미르
17/12/22 07:18
수정 아이콘
(수정됨) scanf에 %d라서 그런게 아닌가 싶습니다.
제가 기억하기로는 scanf에서 %d 시에 int형으로 받는데 char형이 변수로 있으니 에러가 뜨는게 아닐까요
이은영
17/12/22 07:41
수정 아이콘
scanf 함수에서 서식지정자 %d의 변수 형태는 int로 써야하는게 정해진거군요 ㅠ
printf는 되는데 왜 scant는 안되는지 한참 고민했네요.
답변 감사드립니다!
타츠야
17/12/22 07:29
수정 아이콘
(수정됨) https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm
위 링크에서처럼 원래 scanf 안에 type과 argument type을 맞춰 주는게 맞긴 하죠.
컴파일러 옵션에 따라 다릅니다만 의도하지 않은 type cast도 warning으로 띄울 수 있습니다.
이은영
17/12/22 07:41
수정 아이콘
scanf 함수에서 서식지정자 %d의 변수 형태는 int로 써야하는게 정해진거군요 ㅠ
printf는 되는데 왜 scant는 안되는지 한참 고민했네요.
답변 감사드립니다!
17/12/22 07:51
수정 아이콘
(수정됨) Argument type이 정확한 문제라기 보다는, char의 수용 가능한 크기가 int (%d)보다 작기 때문에 scanf에서만 워닝/에러창이 뜨는 것입니다.
char는 1byte로 int로 변환하면 -128 ~ 127까지만 입력이 되지만, %d는 int의 max (s^31-1) 값까지 입력 될 수 있죠. 여기서 범위가 큰 int 값을 char에 넣으려고 하면 문제가 되지만(scanf로 int를 char에 대입), 범위가 작은 char 값을 int 값에 넣는 것은 오류가 없기 때문에(printf로 char를 int로 출력) scanf 만 문제가 있는 것입니다.
AirQuick
17/12/22 09:06
수정 아이콘
입력은 동적이므로 엄격하게 봐야 에러가 없습니다. 입력과 변수의 타입이 맞는 것이 중요한데, 그래야 프로그램이 제대로 잘 돌아갈 수 있기 때문입니다.
위 경우는 %d로 정수 입력 (4 bytes)을 받겠다고 했는데 값을 담을 수 있는 그릇은 char 자료형 (1 byte)이므로 최대 3 bytes가 손실될 수 있는 가능성이 있습니다. 따라서 오류를 발생시켜서 입력이 손실될 수 있다는 것을 알려준 것이죠.
반면에 출력은 정적이고, C의 특성상 프로그래머에게 많은 것을 맡기기 때문에 위 경우는 char 자료형에 들어있는 값을 정수 형태로 출력하는 것이 프로그래머의 의도라고 생각하여 컴파일 에러가 발생하지 않는 것입니다.
이은영
17/12/22 09:34
수정 아이콘
완벽히 이해했어요!
덕분에 헷갈리던 개념도 머리속에 바로 잡았네요!
감사합니다!
17/12/22 10:08
수정 아이콘
크으... 깔끔한 답변이다
17/12/23 15:49
수정 아이콘
printf에서는 %d를 쓴 것과는 상관 없이, char 형의 인수는 가변 인수로 전달될 때 int 형으로 바뀌어 전달되기 때문입니다.

http://en.cppreference.com/w/cpp/language/variadic_arguments
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
113636 [질문] [W3] 워크래프트 3 휴오전 질문 [7] Andromath1579 17/12/22 1579
113635 [질문] C언어 초보질문입니다. [9] 이은영10091 17/12/22 10091
113634 [질문] 노트북 하스스톤 소음관련 질문입니다. 듣는사람1557 17/12/22 1557
113633 [질문] ps4 pro 전원 연결시에 잘못된 방법으로 해왔는데.. [1] 페리에쥬에6176 17/12/22 6176
113632 [질문] 소득없는 분이 중환자실에 입원했는데 지원받을 수 있는 곳이 있나요? [8] 멍멍머멈엉멍3720 17/12/22 3720
113631 [질문] 모니터 알파스캔 aoc 2777 사도 될까요? [22] 다크 나이트4583 17/12/21 4583
113630 [질문] 자동차에서 거북한 냄새 안 나게 하는 방법이 있을지요...? [4] nexon2916 17/12/21 2916
113629 [질문] 아이패드 악세서리 오프라인에서 구입할만한 곳 있나요? [2] 더 잔인한 개장수1551 17/12/21 1551
113628 [질문] 듀얼모니터를 구성하려면 컴퓨터사양이 좋아야하나요? [8] 정공법8499 17/12/21 8499
113627 [질문] 구직 사이트의 이력서를 기업들이 열람하는 이유는 무엇일까요? [12] Crooked4979 17/12/21 4979
113626 [질문] 스마트폰SK 와이파이KT 사용할수 있나요? [2] 로랜1691 17/12/21 1691
113625 [질문] 스타1 리마스터 유닛영어음성이 원래 안되나요? [1] wlfkfakfk4331 17/12/21 4331
113624 [질문] kbs 파업에 관해 궁금한 것이 있습니다. [3] 코메다2011 17/12/21 2011
113623 [질문] 여친 크리스마스 선물 뭐가 좋을까요? [7] formars3024 17/12/21 3024
113622 [질문] 150~200만 손목시계 추천 부탁드립니다. [17] kaz2936 17/12/21 2936
113621 [질문] 집사분들, 고양님 자주 안거나 몸에 올리시나요? [8] 라플비2487 17/12/21 2487
113620 [질문] 하스스톤 5만원 정도만 질러볼까 하는데 [18] Lovely Rachel2247 17/12/21 2247
113619 [질문] 포토샵, 일러, 애펙용 컴퓨터 견적 조언 부탁드립니다.(2번째) [6] macaulay2601 17/12/21 2601
113618 [질문] 비트코인 질문입니다 [6] 손연재2913 17/12/21 2913
113617 [질문] 컴퓨터 작업이 많은데요. 안경을 쓸까요? [5] Genius2425 17/12/21 2425
113616 [질문] 사고 났을 때 도로에 차 세워두는 것 [3] 사이시옷2606 17/12/21 2606
113614 [질문] cgv vip 쿠폰 선물 [4] phoe菲3593 17/12/21 3593
113613 [질문] KT@G 릴 전자담배 원래 이런가요? [3] 시지프스3495 17/12/21 3495
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로