[완료]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데 왜 오류가 나는 지 모르겠습니다 ㅠㅠ

hangsookang의 이미지

우선 코드는

#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 프로그래밍이란 책으로 공부 중에 오류가 났는데... )
=============================================================

라스코니의 이미지

scanf("%c %c", &a, &b);
될지도 모르겠네요 ~

hangsookang의 이미지

답글 감사합니다만 안되네요 ㅠ
이건 아주 엉뚱한 숫자들이 튀어나옵니다 ㅠㅠ

"안됨 말고,"

cleansugar의 이미지

하드웨어와 컴파일러에 따라 싸인드 여부가 다르다고 합니다.
http://www.velocityreviews.com/forums/t699844-can-a-character-be-negative.html

소스에는 ;가 ,인 것 빼고는 문제가 없습니다.

무슨 컴파일러 쓰시나요?

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

cleansugar의 이미지

%d 에서 문제가 있었군요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

cleansugar의 이미지

%d->%c군요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

hangsookang의 이미지

위에 라스코니님이 알려주셔서 해봤는데
이렇게 수정하면 아주 엉뚱한 숫자들이 나옵니다
가령
1 과 2 를 대입하면 99 가 나옵니다

"안됨 말고,"

cleansugar의 이미지

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

hangsookang의 이미지

%c 에 대해 찾아보고 어떻게 처리해야되나 고민하던 중에 답을 주셨네요
감사합니다. 결과는 제대로 나옵니다.

이제 저 코드가 왜 안되는 코드인지 고민해봐야겠습니다 ^^ 감사합니다~~~

"안됨 말고,"

cleansugar의 이미지

잘 되는데요?

http://ideone.com/S4UN6

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

hangsookang의 이미지

네 알려주신대로 하면 잘 됩니다만...

아.. ㅎㅎㅎ 제가 말한 '안되는 저 코드'는 본문의 코드 말한겁니다 오해 없으시길 ^^

"안됨 말고,"

cleansugar의 이미지

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

이렇게 하면 signed int가 char로 캐스팅 됩니다.

이 때 - 부호는 MSB가 1이 됩니다.

이것 때문에 이상한 숫자로 캐스팅이 되는거죠.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

hangsookang의 이미지

얼추 알 것도 같습니다...
선언은 1바이트 짜리로 하고
정작 받아들일 때는 4바이트로 받아들이면서
데이터손실이 생겼다는건가요?

"안됨 말고,"

hangsookang의 이미지

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);

hangsookang의 이미지

결과는 잘 나옵니다.
buf[256]
gets함수
sscanf함수는 좀 더 공부해봐야겠네요 ㅎㅎ

새로운 걸 알려주셔서 감사합니다

이제 저 코드가 왜 안되는지 고민해보겠습니다 ~~

"안됨 말고,"

dltkddyd의 이미지

printf("-50 이상 +50 이하의 수 둘 입력 : "), scanf("%d %d", &a, &b);

부분을 다음과 같이 고쳐야합니다.

printf("-50 이상 +50 이하의 수 둘 입력 : ");
scanf("%d %d", &a, &b);

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

hangsookang의 이미지

둘 다 결과는 같게 나옵니다 ^^;;;

"안됨 말고,"

강동우의 이미지

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 이란 숫자가 저장되게 됩니다. 일종의 스택오버플로우라고 할까요?

hangsookang의 이미지

네 결국 오버플로에서 답을 찾았습니다 ㅎㅎ
오버플로에서만 끝나는 것도 아니고
리틀/빅엔디안도 생각해줘야 하는 문제였더라구요 ㅎㅎ
무튼 답은 감사드립니다

long guard[100]하고 스택에대해서도 공부해봐야겠네요

"안됨 말고,"

planetarium의 이미지

연결된 포스트 :
http://kldp.org/node/129602 ( [완료][추가질문]열혈강의 c 프로그래밍이란 책으로 공부 중에 오류가 났는데... )

hangsookang의 이미지

본문에도 달아놓겠습니다 :)

"안됨 말고,"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.