• ベストアンサー

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人目の氏名入力を飛ばさずに進行するのか教えてください。

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

  • ベストアンサー
  • yeslets
  • ベストアンサー率31% (47/151)
回答No.3

入力された文字は一度stdinという場所に溜まると考えてください。  scanf("%d",&count[i]); の所で、60と入力してENTERキーを押した時、 stdinには 60↓ という3文字が入っています(↓は改行文字\n) scanfには改行文字が引き渡されずにstdinに残ります。 そこで、次のgetsがこの改行文字を受け取ってしまいます。 そのようになっているので、2回目のループではss[1]に改行文字が格納され、自動的に次の「得点:」を表示します。 これを簡単に修正するには、scanf("%d",&count[i]); の下に    getchar(); を入れてください。

urufuru2
質問者

お礼

回答ありがとうございます。 教えていただいたやり方でうまくいきました。ありがとうございます。説明までしていただいて、とても解りやすかったです。ありがとうございました。

その他の回答 (4)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.5

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]); に変更。

urufuru2
質問者

お礼

回答ありがとうございます。 教えていただいた方法でうまくいきました。 いろいろな方法で今回の問題が改善されることがとても勉強になりました。ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

なんか最近似たような質問がありました http://okweb.jp/kotaeru.php3?q=1705652

urufuru2
質問者

お礼

回答ありがとうございます。 確かに似ていますね。参考にさせていただきます。 ありがとうございました。

  • kamejiro
  • ベストアンサー率28% (136/479)
回答No.2

こんばんは。 ちょっと試してみました。 10行目を gets(ss[i]); → scanf("%s",&ss[i]); に変更すると、うまくいくと思います。

urufuru2
質問者

お礼

回答ありがとうございます。 No1の方同様にスペースを入れるとやはりうまく進行しませんでした。自分の説明不足で申し訳ないです。 ありがとうございました。

  • abekkan
  • ベストアンサー率27% (83/305)
回答No.1

何で氏名入力はgetsを使ってるんですか? 得点入力と同じscanfではダメですか。 print文に改行(\n)がないですね。得点入力のあとに、 printf("%d\n",count[i]); と入れたらどうですか。

urufuru2
質問者

お礼

回答ありがとうございます。 自分も最初はscanfを使っていたのですが、苗字と名前の間にスペースを入れたかったのでgetsで作成しました。質問内容に書いておくべきでした・・・ 教えていただいたものを試したのですが、やはりスペースが入るとうまくいきませんでした。 回答ありがとうございました。

関連するQ&A