電子書籍の厳選無料作品が豊富!

C言語初心者です。次のプログラムの実行結果が、その下のようになりました。

(プログラムソース)
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a, b;

nyuuryoku:
printf("2つの整数a、bを入力してください。\n");
printf("a = ?"); scanf("%d", &a);
printf("b = ?"); scanf("%d", &b);
printf("復唱:\n");
printf("a = %d\nb = %d\n", a, b);

printf("a + b = %d\n", a + b);

printf("続けますか?[y/n]");
y_or_n:
while(1)
{
switch (getchar())
{
case 'y':
case 'Y':
printf("\n");
goto nyuuryoku;
case 'n':
case 'N':
return EXIT_SUCCESS;
default:
{
printf("yまたはnを入力してください。\n");
goto y_or_n;
}
}
}
}
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

(実行結果)
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
2つの整数a、bを入力してください。
a = ?(1と入力)
b = ?(5と入力)
復唱:
a = 1
b = 5
a + b = 6
続けますか?[y/n]yまたはnを入力してください。
yまたはnを入力してください。(mと入力)
yまたはnを入力してください。(nと入力)
(終了)
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

上の実行結果で、意図している動作は、
「続けますか?[y/n]」
のところで入力待ちをして、'm'が入力されると
「yまたはnを入力してください。」
と表示されて、次の入力の待ちになることです。

しかし、上の実行結果のように、入力待ちの前に
「yまたはnを入力してください。」
が余分に1回表示されてしまいます。

defaultラベルではなく、if文でwhile()の前とか後とかに指定していくつかやってみましたが、同じことになってしまいます。

どこがいけないのでしょうか? どうすれば意図した動作をしてくれるのでしょうか。

多分初歩の初歩のところでつまづいているのだと思いますが、よろしくお願い致します。

A 回答 (3件)

printf("b = ?"); scanf("%d", &b);


のところで、
入力の文字の読み残りが出るようです。具体的には、末尾の改行コード。

よって、
printf("b = ?"); scanf("%d ", &b);//dの後ろにスペースを入れました。
みたいな対処がいるようです。

間違えているかもしれません。他の方の回答も確認して下さい。
    • good
    • 0
この回答へのお礼

scanf()関数のコードの読み残りですか、ちょっと私の参考書にも載っていました。また勉強します。ありがとうございました。

お礼日時:2018/12/23 17:41

あまり詳しくないのですがこんなのでどうですかね


あまり深く考えないで回答してますので意図しているものと違っていたら言ってくださいね

#include <stdio.h>
int main(void)
{
int a, b;
char ans;
do {
printf("2つの整数a、bを入力してください。\n");
printf("a = ?"); scanf("%d", &a);
printf("b = ?"); scanf("%d", &b);
printf("復唱:\n");
printf("a = %d\nb = %d\n", a, b);
printf("a + b = %d\n", a + b);
printf("続けますか?[y/n]\n");
scanf("%*c%c", &ans);

while(ans!='y') {
printf("yまたはnを入力してください\n");
scanf("%*c%c", &ans);
if (ans=='n') break;
}

}while(ans=='y');
}
    • good
    • 0
この回答へのお礼

do-while文ですか、試してみます。ありがとうございました。

お礼日時:2018/12/23 17:40

switch (getchar())


ここが改行コードなどを一文字として処理してるんじゃないですかね

あと、goto分は可読性を悪くします
    • good
    • 0
この回答へのお礼

ありがとうございます。ご回答を元に検証してみます。goto文については賛否両論あるようですが、今のところはほかに思いつかないので使っています。

お礼日時:2018/12/23 17:40

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