こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語で3人分の合計と平均を出を出したいのですが・・・

#include <stdio.h>

void main (void)
{
inti;
intsum = 0;
intcount[3];
charss[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人目の氏名入力を飛ばさずに進行するのか教えてください。

投稿日時 - 2005-10-16 01:30:01

QNo.1716941

すぐに回答ほしいです

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

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

これを簡単に修正するには、scanf("%d",&count[i]);
の下に
   getchar();
を入れてください。

投稿日時 - 2005-10-16 01:56:56

お礼

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

投稿日時 - 2005-10-18 23:15:53

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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]);

に変更。

投稿日時 - 2005-10-16 11:16:29

お礼

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

投稿日時 - 2005-10-18 23:18:24

ANo.4

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

投稿日時 - 2005-10-16 02:28:22

お礼

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

投稿日時 - 2005-10-18 23:19:46

ANo.2

こんばんは。
ちょっと試してみました。

10行目を
gets(ss[i]); → scanf("%s",&ss[i]);
に変更すると、うまくいくと思います。

投稿日時 - 2005-10-16 01:54:10

お礼

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

投稿日時 - 2005-10-18 23:12:02

ANo.1

何で氏名入力はgetsを使ってるんですか?
得点入力と同じscanfではダメですか。

print文に改行(\n)がないですね。得点入力のあとに、
printf("%d\n",count[i]);
と入れたらどうですか。

投稿日時 - 2005-10-16 01:45:47

お礼

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

投稿日時 - 2005-10-18 23:09:39