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も見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
C言語におけるfgetsを用いたループ処理について
C言語・C++・C#
-
別ファイルの構造体の値を読み込む、変えるには?2
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
c言語のコンパイルエラー canno...
-
doubleの変数にintとintの割り...
-
c言語のプログラミングについて...
-
実数型の変数に値を入力した計...
-
VBの As Single はC++では・...
-
listに構造体を格納
-
c言語で、繰り返し文の中で、0....
-
sin,cos,tanを求めるプログラム...
-
サンプル遅れ
-
^この記号を使わない
-
C言語(プログラミング)関連の質...
-
long doubleの有効桁数を教えて...
-
シンプソン則について
-
セグメントエラー
-
C++プログラムの問題。。
-
テイラー展開(C言語)
-
関数におけるif文とreturn文に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
int とdoubleの比較
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
C言語でdouble型の小数点の引き...
-
たくさんの数の平均を求める方...
-
斜辺と角度て底辺と高さを出したい
-
C言語で台形公式を使った二重積...
-
float?数字の後にLがつくもの
-
listに構造体を格納
おすすめ情報