dポイントプレゼントキャンペーン実施中!

--------------------------------------
#include<stdio.h>
int main(void)
{
double dt=0.0,sum=0.0;
char ss[80];
int ret;

ret=scanf("%lf",&dt);
puts("");

if(ret!=1){
gets(ss);
printf("数値を入力してください\n");
puts("");
}

while(dt!=999){
sum=sum+dt;
ret=scanf("%lf",&dt);
puts("");

if(ret!=1){
gets(ss);
printf("数値を入力してください\n");
puts("");
}
}
printf("合計=%f\n",sum);
return 0;
}
--------------------------------------

以上のプログラムで、入力した数値の合計を出し「999」が入力されたら終了させ、数値以外が入力されたら、gets関数で読み捨て入力を続けていくということをしたいのですが、例えば、

◎1-----------
2

3

4

999

合計=9.000000
---------------
◎1のように数値のみだと正しく表示されます。
次に、

◎2--------------------
a

整数を入力してください

b

整数を入力してください

2

3

999

合計=5.000000
------------------------
◎2のように数値以外を先に入力し、その後に数値を入力しても正しく表示されます。
次に、

◎3-------------------
2

3

a

数値を入力してください

b

数値を入力してください

999

合計=11.000000
-----------------------
◎3のように数値を入力した後に、数値以外を入力したら正しく表示されません。
次に、

◎4--------------------
2

a

整数を入力してください

b

整数を入力してください

3

999

合計=9.000000
------------------------
◎4のように数値をまず入力しその後、数値以外を入力する。その後、数値を入力して終了させても、合計値が正しく表示されません。

まだ、バッファについて完全に理解していないということもあり、何故こうなってしまうのか分かりません。
教えていただけると嬉しいです。

A 回答 (15件中11~15件)

質問者さんの環境が


rewind(stdin);
を使えないような特殊なものだったら、
#3さんのとおりになさってみてください。それでいまくいけば万々歳ですね。
まあおそらく、
rewind(stdin);
でじゅうぶんではないかと思いますけれど。
    • good
    • 0

#3さん


>処理系が不明なので rewind(stdin); は不可>#2

お言葉ですが、rewindはれっきとした標準関数に属します。
今回の仕様を満たすために使用することは、全く問題ありません。
    • good
    • 0

処理系が不明なので rewind(stdin); は不可>#2. 代わりに int ch; を定義してから


while ((ch = getchar()) != '\n' && ch != EOF);
くらい.
    • good
    • 0

scanfの入力(結果)をgetsで読み捨てる、というのが


どういうことを指しているのか、どうもピンと来ません。

#include <stdio.h>
int main(void)
{
double dt, sum = 0;

while (1) {
printf("数値を入力してください(999で終了)\n");
if (scanf("%lf", &dt) == 1) {
if (dt != 999) {
sum += dt;
}
else {
break;
}
}
else {
printf("数値以外を入力しましたね。\n");
rewind(stdin);
}
}
printf("合計=%f\n", sum);
return 0;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

rewind関数を参考書で見てみたのですが、初心者なため、どうも使い方が理解できませんでした。すいません。

----------------------------
#include<stdio.h>
int main()
{
int n=0;
int ret;
char ss[80];

while(n==0){
printf("n=");
ret=scanf("%d",&n);
if(ret!=1){
gets(ss);
}
}
return 0;
}
----------------------------
以上のプログラムが参考書にあり、整数以外の入力があった場合は、バッファ内から消す?(参考書にはバッファ内に残したデータを読み捨てると書いてありました)というものでした。
これを、数値の連続加算に応用しようと思いました。

お礼日時:2009/04/03 00:20

加算処理の方法がまずいためでしょう



while( dt!=999 ) {
  // ここで加算処理をしているが
  // 文字など数値以外が入力された場合にも
  // 前回の正常に得られたdtを加算している
  sum += dt;
  ret = scanf( "%lf", &dt )
  if ( ret != 1 ) {
    gets(ss);
    printf("数値を入力してください\n");
    puts("");
    // ここで失敗したのだからdtをリセットする
    dt = 0.0;
  }
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>前回の正常に得られたdtを加算している

以上のご回答というようになっていると分かりました。
例えば、実行結果◎3で「a」、「b」を入力しgetsでバッファ内から消しても、「3」はバッファに残っているということですかね?
「a」、「b」を入力した時点で、「3」はバッファ内でどうなっているのでしょうか?
正常な入力が次に行われるまで、正常に入力された値はバッファ内に残っているということでしょうか?

重ね重ね質問になってしまいましたが、ご回答いただけると嬉しいです。

お礼日時:2009/04/03 00:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!