[완료]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데 왜 오류가 나는 지 모르겠습니다 ㅠㅠ
글쓴이: hangsookang / 작성시간: 금, 2012/01/27 - 9:53오후
우선 코드는
#include <stdio.h> int main(void) { char a, b; char result; printf("-50 이상 +50 이하의 수 둘 입력 : "), scanf("%d %d", &a, &b); result = a + b; printf("두 수의 덧셈 결과 : %d \n", result); return 0; }
이겁니다.
코딩(....이라기 보다는 타이핑 ^^;;;) 하면서도 이상한 점이 없는 것같고,
컴파일에서도 오류가 없었으니 됐구나... 싶었는데
막상 컴파일 끝나고 파일 실행해서
숫자 두개 입력했더니
result 는 무조건 b 값으로 나오더라구요 ㅠㅠ
아직 시작단계라서 그런지
오류의 원인을 모르겠습니다.
참, 변수 a, b, result 를 int 로 선언하면 잘 됩니다...
char 가 -127 부터 +128 까지 저장 할 수 있다고 했는데
왜 안되는지 모르겠습니다 ㅠ
=============================================================
연결된 포스트 :
http://kldp.org/node/129602 ( [완료][추가질문]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데... )
=============================================================
Forums:
혹시 이렇게 하면?
scanf("%c %c", &a, &b);
될지도 모르겠네요 ~
답글 감사합니다만 안되네요 ㅠ 이건 아주 엉뚱한
답글 감사합니다만 안되네요 ㅠ
이건 아주 엉뚱한 숫자들이 튀어나옵니다 ㅠㅠ
"안됨 말고,"
하드웨어와 컴파일러에 따라 싸인드 여부가 다르다고
하드웨어와 컴파일러에 따라 싸인드 여부가 다르다고 합니다.
http://www.velocityreviews.com/forums/t699844-can-a-character-be-negative.html
소스에는 ;가 ,인 것 빼고는 문제가 없습니다.
무슨 컴파일러 쓰시나요?
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
%d 에서 문제가 있었군요.
%d 에서 문제가 있었군요.
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
%d->%c군요.
%d->%c군요.
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
위에 라스코니님이 알려주셔서 해봤는데 이렇게
위에 라스코니님이 알려주셔서 해봤는데
이렇게 수정하면 아주 엉뚱한 숫자들이 나옵니다
가령
1 과 2 를 대입하면 99 가 나옵니다
"안됨 말고,"
scanf("%c %c", &a, &b); 여기에
scanf("%c %c", &a, &b);
여기에 1 2를 입력하면 이게 숫자가 아니라 문자 1 2를 입력하는 게 됩니다.
그래서 애스키코드 '1'이 입력되죠.
따라서 문자 '1'에서 애스키코드 '0'을 빼주면 됩니다.
a-='0';
b-='0';
을 추가하세요.
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
%c 에 대해 찾아보고 어떻게 처리해야되나 고민하던
%c 에 대해 찾아보고 어떻게 처리해야되나 고민하던 중에 답을 주셨네요
감사합니다. 결과는 제대로 나옵니다.
이제 저 코드가 왜 안되는 코드인지 고민해봐야겠습니다 ^^ 감사합니다~~~
"안됨 말고,"
잘
잘 되는데요?
http://ideone.com/S4UN6
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
네 알려주신대로 하면 잘 됩니다만... 아..
네 알려주신대로 하면 잘 됩니다만...
아.. ㅎㅎㅎ 제가 말한 '안되는 저 코드'는 본문의 코드 말한겁니다 오해 없으시길 ^^
"안됨 말고,"
scanf("%d %d", &a, &b); 이렇게
scanf("%d %d", &a, &b);
이렇게 하면 signed int가 char로 캐스팅 됩니다.
이 때 - 부호는 MSB가 1이 됩니다.
이것 때문에 이상한 숫자로 캐스팅이 되는거죠.
재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.
아이디의 아이디어 무한도전
http://blog.aaidee.com
귀태닷컴
http://www.gwitae.com
얼추 알 것도 같습니다... 선언은 1바이트 짜리로
얼추 알 것도 같습니다...
선언은 1바이트 짜리로 하고
정작 받아들일 때는 4바이트로 받아들이면서
데이터손실이 생겼다는건가요?
"안됨 말고,"
printf("-50 이상 +50 이하의 수 둘 입력
printf("-50 이상 +50 이하의 수 둘 입력 : "), scanf("%d %d", &a, &b);
혹시 이거 말씀하시는지요...
printf("-50 이상 +50 이하의 수 둘 입력 : ");
scanf("%d %d", &a, &b);
둘로 나눠도 결과가 같이 나옵니다 ㅠ
컴파일러는 gcc 쓰고 있습니다
"안됨 말고,"
이렇게 해보세요.
아마 newline 이 들어가서 그런거 같은데
char buf[256];
gets(buf);
sscanf(buf, "%c %c", &a, &b);
결과는 잘
결과는 잘 나옵니다.
buf[256]
gets함수
sscanf함수는 좀 더 공부해봐야겠네요 ㅎㅎ
새로운 걸 알려주셔서 감사합니다
이제 저 코드가 왜 안되는지 고민해보겠습니다 ~~
"안됨 말고,"
printf("-50 이상 +50 이하의 수 둘 입력
printf("-50 이상 +50 이하의 수 둘 입력 : "), scanf("%d %d", &a, &b);
부분을 다음과 같이 고쳐야합니다.
printf("-50 이상 +50 이하의 수 둘 입력 : ");
scanf("%d %d", &a, &b);
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
둘 다 결과는 같게 나옵니다 ^^;;;
둘 다 결과는 같게 나옵니다 ^^;;;
"안됨 말고,"
요게 메모리를 덮어써서 그런건데요.
char a;
long guard[100];
char b;
char result; 로 변수 선언 쪽에 추가 하나 해 주시고 컴파일 해 보시면 제대로 결과 나올 겁니다.
a,b, result 주소 값을 출력해 보시면 아시겠지만, 각 주소들은 1바이트 차이가 납니다. 이유는 char 형 변수라 그런건데요, 처음 scanf 를 통해 a에 정수형을 입력 받게 되면 4바이트의 값이 a에 저장 됩니다. 이 때는 a에 제대로 된 값이 저장이 되어 있어요.(1바이트 범위 이내의 숫자일 경우) 허나, 이어지는 &b 입력을 통해 4바이트가 데이터가 쓰여지면서 a의 공간에 값을 덮어 쓰게 되는거죠.
예를 들어 a에 0 b에 이진수로 101111111 이란 숫자(383)을 입력하게 되면 scanf 가 끝난 후에는
a에는 이진수로 1, b에는 01111111 이란 숫자가 저장되게 됩니다. 일종의 스택오버플로우라고 할까요?
네 결국 오버플로에서 답을 찾았습니다
네 결국 오버플로에서 답을 찾았습니다 ㅎㅎ
오버플로에서만 끝나는 것도 아니고
리틀/빅엔디안도 생각해줘야 하는 문제였더라구요 ㅎㅎ
무튼 답은 감사드립니다
long guard[100]하고 스택에대해서도 공부해봐야겠네요
"안됨 말고,"
연결된 포스트
연결된 포스트 :
http://kldp.org/node/129602 ( [완료][추가질문]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데... )
본문에도 달아놓겠습니다 :)
본문에도 달아놓겠습니다 :)
"안됨 말고,"
댓글 달기