:: 게시판
:: 이전 게시판
|
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다. 통합 규정을 준수해 주십시오. (2015.12.25.)
통합규정 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 만 문제가 있는 것입니다.
17/12/22 09:06
입력은 동적이므로 엄격하게 봐야 에러가 없습니다. 입력과 변수의 타입이 맞는 것이 중요한데, 그래야 프로그램이 제대로 잘 돌아갈 수 있기 때문입니다.
위 경우는 %d로 정수 입력 (4 bytes)을 받겠다고 했는데 값을 담을 수 있는 그릇은 char 자료형 (1 byte)이므로 최대 3 bytes가 손실될 수 있는 가능성이 있습니다. 따라서 오류를 발생시켜서 입력이 손실될 수 있다는 것을 알려준 것이죠. 반면에 출력은 정적이고, C의 특성상 프로그래머에게 많은 것을 맡기기 때문에 위 경우는 char 자료형에 들어있는 값을 정수 형태로 출력하는 것이 프로그래머의 의도라고 생각하여 컴파일 에러가 발생하지 않는 것입니다.
17/12/23 15:49
printf에서는 %d를 쓴 것과는 상관 없이, char 형의 인수는 가변 인수로 전달될 때 int 형으로 바뀌어 전달되기 때문입니다.
http://en.cppreference.com/w/cpp/language/variadic_arguments
|