- ベストアンサー
プログラミング言語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; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
getop( )関数の int c は char c のほうがいいのでは "%c" で 初期化していないint型変数に読み込むと残りの3バイトが不定なのでむちゃくちゃな数になりそう
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
デバッグの方法を覚えましょう。 最初は面倒でもprintfなどを使って、 どこまでが実行されて良いるのかを調べたりするなど。 > while ((rc = scanf("%c", &c)) != EOF) 既に指摘されていますが、 cを初期化していないからでしょうね。 そのあとの動作が正しいのか分かりませんが。 1文字入力であれば、scanfより、fgetcなどを 使用するほうが確実だと思います。 # while((c=fgetc(stdin)) != EOF )とか。
お礼
回答ありがとうございます! 「デバック」・・ですか。覚えておきます。 自分はぺーぺーの初心者なんで、ほんとに参考になります。
- tatsu99
- ベストアンサー率52% (391/751)
ご使用のOSとコンパイラは何でしょうか。 一般的には、デバッガ(といわれるもの)を使えば、セグメンテーション違反を起こしている場所が特定できます。 今後、質問される場合は、OSとコンパイラを記述すると、良い回答が得られやすくなりますよ。
お礼
回答ありがとうございます! OSはLINUXです(この答えであってますよね?;) コンパイラはGNOME 端末です。
お礼
回答ありがとうございます。 指摘された箇所を直してみたら、うまくいきました! 自分 初心者なんで、こういうミス見落しがちなんです; ほんとに助かりました!