
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
^この記号を使わない
-
プログラムでの数字につく”f”の...
-
c言語の問題
-
2次方程式の解を求めるプログ...
-
c言語でDFTのプログラムを作成...
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C#イベント中の戻り値の設定の...
-
doubleは常に%lfとするべきなのか
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
DWORDの警告
-
C言語の型による処理速度の違い
-
C言語で台形公式を使った二重積...
-
C言語を実行すると-infが出てき...
-
int とdoubleの比較
-
C言語初心者 構造体 課題について
-
たくさんの数の平均を求める方...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
プログラミングでのテイラー展開
-
C++初心者です。簡単なスコア計...
-
【C言語】二階微分方程式をル...
-
fgets()による繰り返し入力(c言語)
-
2分法で方程式の複数の解を自...
おすすめ情報