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
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
113662 [질문] 플레이스테이션 관련 질문을 드려봅니다. [6] 킹보검2250 17/12/22 2250
113661 [질문] 아이폰X 실버vs스페이스그레이 색상 선택은? [13] delicat4555 17/12/22 4555
113660 [질문] 아이폰 배터리 교체할지 말지 고민입니다. [10] 스핔스핔2227 17/12/22 2227
113659 [질문] 안마의자 추천 부탁드립니다. [9] 갓파고5714 17/12/22 5714
113658 [질문] 진짜 말도 안되게 재밌는 미드든 영드든 없을까요? [32] 로랑보두앵6943 17/12/22 6943
113657 [질문] [패션] 니트 안에 입은 셔츠 질문! [7] 파츠2888 17/12/22 2888
113656 [질문] 인왕이랑 호라이즌제로던중에 뭐가 더 재미있을까요? [14] 자판기냉커피5672 17/12/22 5672
113655 [질문] 강남역 근처에서 조용하고 분위기 좋은 소개팅 장소 질문드립니다. 가고또가고1830 17/12/22 1830
113654 [질문] 서울에 24일 이브날 브런치 호텔뷔페 괜찮은데 없을까요 [3] 삭제됨1715 17/12/22 1715
113653 [질문] 퇴사시 잔여 월급 계산 부탁드립니다. [2] 고구마아1726 17/12/22 1726
113651 [질문] 배그 연사 요령 문의 [5] 마롱4738 17/12/22 4738
113650 [질문] 모니터 문의 알콜성혼수1038 17/12/22 1038
113649 [질문] [배틀그라운드] 최적화 어느정도 느끼셨나요?? [5] 아리골드3539 17/12/22 3539
113648 [질문] 지방세 공무원 현직자 분 계신가요? 질문 있습니다. [4] 생선가게 고양이3056 17/12/22 3056
113647 [질문] [가상화폐] 그냥 해외에서 코인사서 국내거래소에서 팔면 무조건 이익아닌가요? [10] 콘초4957 17/12/22 4957
113646 [질문] 이 영상의 원곡을 찾습니다. [4] 1876 17/12/22 1876
113645 [질문] 적당히 살만한 커피콩 [6] 서쪽으로가자1402 17/12/22 1402
113644 [질문] 큰 길가에 차 한대가 5일째 그냥 서있습니다 [4] 光海2913 17/12/22 2913
113643 [질문] 모니터 60hz와 144hz 차이가 많이 나는가요? [16] 우주견공9745 17/12/22 9745
113642 [질문] 드라이비트 질문입니다. [1] 차밭을갈자1327 17/12/22 1327
113640 [질문] [가상화페] 거래소 사이트마다 가격이 다른게 맞는건가요?? [5] 마인부우3258 17/12/22 3258
113639 [질문] (해축) 나초처럼 중앙 좌우 풀백 다 능숙한 유틸리티 수비수는 누가 있나요? [13] Santorini1877 17/12/22 1877
113638 [질문] 체형 교정 효과를 볼 수 있는 운동이 뭐 있을까요? [9] 메모네이드3336 17/12/22 3336
목록 이전 다음
댓글

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