- ベストアンサー
c言語で3人分の合計と平均を出を出したいのですが・・・
#include <stdio.h> void main (void) { int i; int sum = 0; int count[3]; char ss[3][30]; for (i = 0; i < 3; i++){ printf("氏名: "); gets(ss[i]); printf("得点: "); scanf("%d" , &count[i]); } for (i = 0; i < 3; i++){ sum = sum + count[i]; } printf("\n\n"); printf("合計 :%d point\n" ,sum); printf("平均点:%f point\n" ,(double)sum/i); } このようなものを作ったのですが、実行すると1人分を入力したあと2人目の入力部分の表示が「氏名:得点:」となってしまい、氏名入力を飛ばし得点入力になります。 どのようにすれば2人目の氏名入力を飛ばさずに進行するのか教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
入力された文字は一度stdinという場所に溜まると考えてください。 scanf("%d",&count[i]); の所で、60と入力してENTERキーを押した時、 stdinには 60↓ という3文字が入っています(↓は改行文字\n) scanfには改行文字が引き渡されずにstdinに残ります。 そこで、次のgetsがこの改行文字を受け取ってしまいます。 そのようになっているので、2回目のループではss[1]に改行文字が格納され、自動的に次の「得点:」を表示します。 これを簡単に修正するには、scanf("%d",&count[i]); の下に getchar(); を入れてください。
その他の回答 (4)
- TT414
- ベストアンサー率18% (72/384)
printfはメモリ上のバッファに文字を貯めて、すぐに表示しないで、printfの表示より、scanfが実行されるためです。 printfの結果をすぐ表示するためにfflush(stdout);を実行してください。 >printf("氏名: "); >gets(ss[i]); >printf("得点: "); >scanf("%d" , &count[i]); を printf("氏名: "); fflush(stdout); gets(ss[i]); printf("得点: "); fflush(stdout); scanf("%d" , &count[i]); に変更。
お礼
回答ありがとうございます。 教えていただいた方法でうまくいきました。 いろいろな方法で今回の問題が改善されることがとても勉強になりました。ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
なんか最近似たような質問がありました http://okweb.jp/kotaeru.php3?q=1705652
お礼
回答ありがとうございます。 確かに似ていますね。参考にさせていただきます。 ありがとうございました。
- kamejiro
- ベストアンサー率28% (136/479)
こんばんは。 ちょっと試してみました。 10行目を gets(ss[i]); → scanf("%s",&ss[i]); に変更すると、うまくいくと思います。
お礼
回答ありがとうございます。 No1の方同様にスペースを入れるとやはりうまく進行しませんでした。自分の説明不足で申し訳ないです。 ありがとうございました。
- abekkan
- ベストアンサー率27% (83/305)
何で氏名入力はgetsを使ってるんですか? 得点入力と同じscanfではダメですか。 print文に改行(\n)がないですね。得点入力のあとに、 printf("%d\n",count[i]); と入れたらどうですか。
お礼
回答ありがとうございます。 自分も最初はscanfを使っていたのですが、苗字と名前の間にスペースを入れたかったのでgetsで作成しました。質問内容に書いておくべきでした・・・ 教えていただいたものを試したのですが、やはりスペースが入るとうまくいきませんでした。 回答ありがとうございました。
お礼
回答ありがとうございます。 教えていただいたやり方でうまくいきました。ありがとうございます。説明までしていただいて、とても解りやすかったです。ありがとうございました。