
--------------------------------------
#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のように数値をまず入力しその後、数値以外を入力する。その後、数値を入力して終了させても、合計値が正しく表示されません。
まだ、バッファについて完全に理解していないということもあり、何故こうなってしまうのか分かりません。
教えていただけると嬉しいです。
No.5
- 回答日時:
質問者さんの環境が
rewind(stdin);
を使えないような特殊なものだったら、
#3さんのとおりになさってみてください。それでいまくいけば万々歳ですね。
まあおそらく、
rewind(stdin);
でじゅうぶんではないかと思いますけれど。
No.4
- 回答日時:
#3さん
>処理系が不明なので rewind(stdin); は不可>#2
お言葉ですが、rewindはれっきとした標準関数に属します。
今回の仕様を満たすために使用することは、全く問題ありません。
No.3
- 回答日時:
処理系が不明なので rewind(stdin); は不可>#2. 代わりに int ch; を定義してから
while ((ch = getchar()) != '\n' && ch != EOF);
くらい.
No.2
- 回答日時:
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;
}
ご回答ありがとうございます。
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;
}
----------------------------
以上のプログラムが参考書にあり、整数以外の入力があった場合は、バッファ内から消す?(参考書にはバッファ内に残したデータを読み捨てると書いてありました)というものでした。
これを、数値の連続加算に応用しようと思いました。
No.1
- 回答日時:
加算処理の方法がまずいためでしょう
while( dt!=999 ) {
// ここで加算処理をしているが
// 文字など数値以外が入力された場合にも
// 前回の正常に得られたdtを加算している
sum += dt;
ret = scanf( "%lf", &dt )
if ( ret != 1 ) {
gets(ss);
printf("数値を入力してください\n");
puts("");
// ここで失敗したのだからdtをリセットする
dt = 0.0;
}
}
ご回答ありがとうございます。
>前回の正常に得られたdtを加算している
以上のご回答というようになっていると分かりました。
例えば、実行結果◎3で「a」、「b」を入力しgetsでバッファ内から消しても、「3」はバッファに残っているということですかね?
「a」、「b」を入力した時点で、「3」はバッファ内でどうなっているのでしょうか?
正常な入力が次に行われるまで、正常に入力された値はバッファ内に残っているということでしょうか?
重ね重ね質問になってしまいましたが、ご回答いただけると嬉しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- Java Java 年数計算 3 2023/01/28 10:52
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
プログラミングの問題で、キー...
-
プログラミング初心者です。 Py...
-
Eclipseコンソール表示を、リセ...
-
java初心者です。入力されたの...
-
if文の条件にscanf関数を使うと…?
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
入力する数字のサイズ制限について
-
Yesならこっちへ、NOなら...
-
scanf()の順番
-
C言語でscanfが認識されません
-
文字列で条件分岐 if swtich
-
C言語 for文をつかって記号を表...
-
scanfでの可変引数
-
ワードで文字を入力する時の変...
-
VB カウントダウンタイマーの作...
-
C言語でつるかめ算をするにはど...
-
scanf が無視されます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報