• ベストアンサー

プログラミング言語Cの演習

以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

getop( )関数の int c は char c のほうがいいのでは "%c" で 初期化していないint型変数に読み込むと残りの3バイトが不定なのでむちゃくちゃな数になりそう

p_hetare
質問者

お礼

回答ありがとうございます。 指摘された箇所を直してみたら、うまくいきました! 自分 初心者なんで、こういうミス見落しがちなんです; ほんとに助かりました!

その他の回答 (2)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

デバッグの方法を覚えましょう。 最初は面倒でもprintfなどを使って、 どこまでが実行されて良いるのかを調べたりするなど。 > while ((rc = scanf("%c", &c)) != EOF) 既に指摘されていますが、 cを初期化していないからでしょうね。 そのあとの動作が正しいのか分かりませんが。 1文字入力であれば、scanfより、fgetcなどを 使用するほうが確実だと思います。 # while((c=fgetc(stdin)) != EOF )とか。

p_hetare
質問者

お礼

回答ありがとうございます! 「デバック」・・ですか。覚えておきます。 自分はぺーぺーの初心者なんで、ほんとに参考になります。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

ご使用のOSとコンパイラは何でしょうか。 一般的には、デバッガ(といわれるもの)を使えば、セグメンテーション違反を起こしている場所が特定できます。 今後、質問される場合は、OSとコンパイラを記述すると、良い回答が得られやすくなりますよ。

p_hetare
質問者

お礼

回答ありがとうございます! OSはLINUXです(この答えであってますよね?;) コンパイラはGNOME 端末です。

関連するQ&A