アプリ版:「スタンプのみでお礼する」機能のリリースについて

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
プログラムを終了します

A 回答 (1件)

double input(){


double n;
printf("数値>>");
scanf("%lf", &n);
return n;
}
で、scanf("%lf", &n);では、数値入力後の改行が残っていますから、
次の fgets で、数値以後、改行までの入力を読み込みます。
(通常、改行だけ読み込むことになります。)
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました

お礼日時:2020/06/07 11:25

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