do-while文の中で繰り返しfgets関数で文字列を読み取り、計算するプログラムを作りたいのですが、実行すると必ず一回分空の入力がされてしまいます。
これは何が原因なのでしょうか、またどのように修正すればよいでしょうか?
#include<stdio.h>
#include<string.h>
//ユーザー関数のプロトタイプ宣言
void show(double ans, double oldans, double mem, double oldmem, double num, char *str);//表示用関数show()
double input();//数値入力用関数input()
//関数の呼び出しと実行
int main(){
//計算値, 変化前の計算値, メモリ, 変化前のメモリ, 数値
double ans=0, oldans=0, mem=0, oldmem=0, num=0;
//演算子の文字列
char str[4], dummy;
do{
show(ans, oldans, mem, oldmem, num, str);
oldans = ans;
oldmem = mem;//変化前の値を表す変数に現在の値を代入
printf("演算子>>");
//fgets(dummy,1,stdin);
fgets(str, 4, stdin);//演算子文字列の入力
char *ln = strchr(str, '\n'); /* 改行文字を検索 */
if (ln != NULL) {
*ln = '\0';
}
else {
while (1) {
int c = getchar();
if (c == '\n' || c == EOF) break;
}
}
if(!strcmp(str,"+")){
num = input();
ans += num;
}else if(!strcmp(str,"-")){
num = input();
ans -= num;
}else if(!strcmp(str,"*")){
num = input();
ans *= num;
}else if(!strcmp(str,"/")){
num = input();
if(num == 0){
printf("0で割ることは出来ません\n");
printf("もう一度入力してください\n");
}else{
ans /= num;
}
}else if(!strcmp(str,"m+")){//メモリの加算
mem += ans;
strcpy(str,"+");
}else if(!strcmp(str,"m-")){//メモリの減算
mem -= ans;
strcpy(str,"-");
}else if(!strcmp(str,"cm")){//メモリの消去
mem = 0;
oldmem = mem;
printf("memory : %lf\n", mem);
}else if(!strcmp(str,"cl")){//計算値の初期化
ans = 0;
oldans = ans;
}else if(!strcmp(str,"ca")){//メモリと計算値の初期化
mem = 0;
oldmem = mem;
printf("memory : %lf\n", mem);
ans = 0;
oldans = ans;
}else if(!strcmp(str,"=")){
ans += mem;
printf("\nanswer : %lf + %lf = %lf\n", oldans, mem, ans);
printf("\n計算を続けますか?\ny/n >>");
scanf("%c", str);
}else{
printf("\nもう一度入力してください\n%s", str);
}
}while(strcmp(str,"n")!=0);
printf("プログラムを終了します");
return 0;
}
//プロトタイプ宣言した関数の定義
void show(double ans, double oldans, double mem, double oldmem, double num, char *str){//演算子の引数はポインタ
if(mem != 0){//#s1メモリが0でないとき表示する
if(mem == oldmem){//#s1.2メモリの変化の有無による表示の切り替え
printf("\nmemory : %lf\n", mem);//そのまま表示
}else{
printf("\nmemory : %lf%s%lf = %lf\n", oldmem, str, ans, mem);//変化を計算式として表示
}
}else{
printf("\n");
}
if(ans == oldans){//#s2計算結果の変化の有無による表示の切り替え
printf("answer : %lf\n", ans);
}else{
printf("answer : %lf%s%lf = %lf\n", oldans, str, num, ans);
}
}
double input(){
double n;
printf("数値>>");
scanf("%lf", &n);
return n;
}
実行結果
answer : 0.000000
演算子>>+
数値>>3
answer : 0.000000+3.000000 = 3.000000
演算子>>
もう一度入力してください
answer : 3.000000
演算子>>=
answer : 3.000000 + 0.000000 = 3.000000
計算を続けますか?
y/n >>n
プログラムを終了します
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
doubleの変数にintとintの割り...
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
float型とdouble型の変数の違い...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
C言語で-23乗を取り扱うには
-
C言語の型による処理速度の違い
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
difftime()について
-
2分法で方程式の複数の解を自...
-
ラグランジュの補間法のCプログ...
-
int とdoubleの比較
-
C言語 入力した数値の平均値の...
-
C言語のマクローリン展開ローラ...
-
C言語で表記についの質問です
-
π
-
C言語(プログラミング)関連の質...
-
2次方程式の解
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
おすすめ情報