- 締切済み
課題がうまくいかない
課題で < と入力されたら < と表示し、 > と入力されたら > と表示し、…といった感じで5種類の入力に対応して表示させるプログラムを書いたのですが、うまく思った通りの結果がでません。我ながら汚いプログラムだと思いますが、自分が考えたプログラムは以下のようです。 #include <stdio.h> int main(void){ char c[50]; int i=0; while(c[i]!=-1){ scanf("%c",&c[i]); i=i+1; } if((c[0]=='&')&&(c[1]=='l')&&(c[2]=='t')&&(c[3]==';')){ printf("<"); } else if((c[0]=='&')&&(c[1]=='g')&&(c[2]=='t')&&(c[3]==';')){ printf(">"); } else if((c[0]=='&')&&(c[1]=='a')&&(c[2]=='m')&&(c[3]=='p')&&(c[4]==';')){ printf("&"); } else if((c[0]=='&')&&(c[1]=='q')&&(c[2]=='u')&&(c[3]=='o')&&(c[4]=='t')&&(c[5]==';')){ printf("\""); } else if((c[0]=='&')&&(c[1]=='a')&&(c[2]=='p')&&(c[3]=='o')&&(c[4]=='s')&&(c[5]==';')){ printf("'"); } return(0); } こんな感じです。 何卒アドバイスお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- dummyplug
- ベストアンサー率58% (134/230)
質問に挙げてもらったプログラムにはいくつかの問題があります。(だから動かないわけですが。)私が課題の出題者(あなたの先生や上司など)ならばこのコードを題材にして何が問題なのかを気づいてもらえるように指導するところですが、文字数制限のあるこの場所ではちょっと厳しいです。 私が思うに、ここまでコードを書いた(おそらくご自身できちんと考えたのだと想像します)なら出題者の期待する第一段階としては十分で、次のステップとしてはこれを持って出題者に質問しに行くのがベストだと思います。出題者はもしかすると忙しいなどでちょっといやな顔をする人もいるかもしれませんが、教育する役割を負っているはずなのできっと(回答に至るヒントを)教えてくれるのではないかと思います。 ただ、このプログラムを書きっぱなしにしないで「これでうまく動くはず(なのに動かない)」というところまでは自省して考えてから持って行ってください。その方が「こういうことだと思っていたが違った」という誤りに気づいたときに力になるはずです。 また、できれば「動かないけど提出」ではなくてぜひ質問しに行ってください。 あなたがいい先生についていることを期待しています。 余談ですが「gets()は使ってはいけないことになっている」のには理由があるはずです。それは「それを使うと簡単に回答できてしまうから」などという安易な理由ではないはずです。それは出題時に解説されているのではないかと思いますが、もし聞いた記憶がないのであればぜひそれも先生に質問してみてください。(「どうしてgets()を使ってはいけないのですか?」と。) 初心者にはちょっと難しい話になるかもしれませんが、あなたのコードにはせっかくgets()の使用を避けたのに同じ問題を抱えています。 なお、もしこの課題が学校や研修などではなくて書籍などを自習していての問題だとすると尋ねる相手(先生)がいないのかもしれません。だとしたらやむを得ないので、この場所で解説するよう試みます。
- amurtiger
- ベストアンサー率0% (0/0)
最近、標準入出力を使っていないので自信はないですが。 (現在は標準入出力のない環境がほどんどなので・・・。) gets()が使ってはだめなら、getchar()を使用したらどうですか? scanf()は入力フォーマットに合わない入力があるとバグるというのが通説で通常は使用しません。 gets()は入力文字列が用意したBufferサイズを超えた場合メモリ破壊につながります。 #define STRING_MAX 80 char string[STRING_MAX]; do { printf("input:"); for ( i = 0; i < STRING_MAX; i++ ) { string[i] = getchar(); if ( string[i] == '\n' ) { /* Enterが押されたらループを抜ける */ break; } /* @1 */ } }while ( string[i] != '\n' ); あと、ついでで入力が数値なら@1の場所に if ( !isdigit(string[i]) ) { /* 数値でない文字が入力されたので再入力させる */ break; } とすることもできます。 ん?これだとVCのみで使えるgetc()のソースかな? getchar()はバッファリングされてEnterが入るまで動作しなかったかも。 その場合、\nでなくてEOFで判定かも・・・。 これ確かめるには@1に if ( string[i] == '\n' ) printf("\\n"); else if ( string[i] == EOF ) printf("[EOF]"); else printf("%c", string[i]); を入れてみてください。
- koko_u_
- ベストアンサー率18% (459/2509)
質問文にも、補足にも「うまくいかない」としか記載がないのが一番の問題です。 どのようにうまくいかないかを把握して、具体的に補足しましょう。 >あとgetsは使ってはいけないことになってるので じゃあ、fgets() で。
- 64bit
- ベストアンサー率51% (45/88)
最初の入力を受け付ける部分がなんか変ですね。初期化していないcの配列を参照してしまっています。 #include <string.h> gets(c); if (!strcmp(c, "<")) printf("<"); else if (!strcmp(c, ">")) printf(">"); ... てな感じでも出来ると思います。課題以外でこんなの書いたら怒鳴られますが。
お礼
早速の回答ありがとうございます。 自分もstrcmp使ってみたんですがどうもうまくいかないです。 あとgetsは使ってはいけないことになってるので 使ってません。strcmpでうまくいかないのもgetsが使えないせいですかね^^;
お礼
詳しい回答ありがとうございます! getcharはEOFで判定できると思うので 試してみます。