C++でのcinについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Makin
記事: 12
登録日時: 8年前

C++でのcinについて

#1

投稿記事 by Makin » 8年前

今以下のコードを書いているのですが、grade()のtempに数字を入力した時は、バグが生じずに上手くループしてくれるのですが、Aを入力すると、if (temp == 'A')がスルーされて、なぜかelse文に引っかかってしまいます。
grade2()に関しても、数字しか入力しない場合はバグが生じないのですが、アルファベット(例えばAやB)を入力すると、”エラーです”というメッセージが表示され、それ以降数字の1~4を入力しても、”エラーです”というメッセージが表示され続けてしまいます。なぜなのでしょうか?よろしくお願いします。

コード:

#include "stdafx.h"
#include <iostream>

using namespace std;

void grade()
{
	int math;
	char temp;


	do {
		cout << "成績(A~D)を入力してください。" << endl;

		cout << "math: ";
		cin >> temp;
     while (getchar() != '\n');
		if (temp == 'A')
			math = 4;
		if (temp == 'B')
			math = 3;
		if (temp == 'C')
			math = 2;
		if (temp == 'D')
			math = 1;
		else
			cout << "エラーです。もう一度入力してください。";
	} while (temp != 'A' && temp != 'B' && temp != 'C' && temp != 'D');
}

void grade2() {
	int math = 1;
	cout << "成績(1~4)を入力してください" << endl;

	do {
		if (math != 1 && math != 2 && math != 3 && math != 4) {
			cout << "エラーです。" << endl;
		}
		cout << "math: ";
		cin >> math;
     while (getchar() != '\n');
	} while (math != 1 && math != 2 && math != 3 && math != 4);
}


かずま

Re: C++でのcinについて

#2

投稿記事 by かずま » 8年前

grade() で、else は if (temp == 'D') にだけ対応しています。temp が 'A'
の場合、temp は 'D' でないので、"エラーです..." になるのは当然です。
2番目以降の if を全部 else if に変えてみてください。

grade2() で math は int です。cin >> math; で 'A' を入力すると、数値の
読み込みに失敗し、cin の内部の iostate の fail ビットが立ちます。
この状態を clear で初期化しない限り、以後の cin からの読み込みはすべて
エラーになります。

改善案

コード:

#include <iostream>
 
using namespace std;
 
void grade2()
{
    int math;
    cout << "成績(1~4)を入力してください" << endl;
    while (1) {
        cout << "math: ";
        cin >> math;
        if (!cin) {  // 読み込み失敗か
            cout << "エラーです。" << endl;
            cin.clear();  // 正常状態に戻す
            while (cin.get() != '\n') ; // 行末まで読み飛ばす
            continue;
        }
        if (math >= 1 && math <= 4)
            break;
        cout << "エラーです。" << endl;
    } 
}

int main()
{
    grade2();
}

Makin
記事: 12
登録日時: 8年前

Re: C++でのcinについて

#3

投稿記事 by Makin » 8年前

複数のifと、else を使うときは、else if にしないといけなかったんですね。

cinでアルファベットを入力してしまうと、初期化しないとずっとエラーになってしまう事を全く知りませんでした。
丁寧な説明と改善コードをありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る