1. ホーム
  2. c++

[解決済み】cin入力ストリームのチェックで整数が生成される

2022-02-18 04:17:20

質問内容

これをタイプしていたら、変数になる2つの整数を入力するようユーザーに要求されました。 そこから簡単な演算が行われます。

入力されたものが整数かどうかをコンピュータに確認させるにはどうしたらよいでしょうか。そして、もしそうでなければ、ユーザーに整数を入力するように求めます。 例えば、誰かが2ではなく"a"を入力したら、数字を再入力するように指示します。

ありがとうございます。

 #include <iostream>
using namespace std;

int main ()
{

    int firstvariable;
    int secondvariable;
    float float1;
    float float2;

    cout << "Please enter two integers and then press Enter:" << endl;
    cin >> firstvariable;
    cin >> secondvariable;

    cout << "Time for some simple mathematical operations:\n" << endl;

    cout << "The sum:\n " << firstvariable << "+" << secondvariable 
        <<"="<< firstvariable + secondvariable << "\n " << endl;

}

解決方法は?

このように確認することができます。

int x;
cin >> x;

if (cin.fail()) {
    //Not an int.
}

さらに、int型を経由するまで入力を取得し続けることができます。

#include <iostream>



int main() {

    int x;
    std::cin >> x;
    while(std::cin.fail()) {
        std::cout << "Error" << std::endl;
        std::cin.clear();
        std::cin.ignore(256,'\n');
        std::cin >> x;
    }
    std::cout << x << std::endl;

    return 0;
}

EDIT: 10abcのような入力に関する以下のコメントに対処するために、入力として文字列を受け入れるようにループを修正することができます。 そして、文字列の中に数字以外の文字がないかどうかをチェックし、その状況に応じて処理します。 この場合、入力ストリームをクリアしたり無視したりする必要はありません。 文字列が数字であることを確認し、文字列を整数に変換する。 というか、これは即席のものである。 もっといい方法があるかもしれない。 浮動小数点数/倍数を受け取る場合は、この方法は使えません(検索文字列に '.' を追加する必要があります)。

#include <iostream>
#include <string>

int main() {

    std::string theInput;
    int inputAsInt;

    std::getline(std::cin, theInput);

    while(std::cin.fail() || std::cin.eof() || theInput.find_first_not_of("0123456789") != std::string::npos) {

        std::cout << "Error" << std::endl;

        if( theInput.find_first_not_of("0123456789") == std::string::npos) {
            std::cin.clear();
            std::cin.ignore(256,'\n');
        }

        std::getline(std::cin, theInput);
    }

    std::string::size_type st;
    inputAsInt = std::stoi(theInput,&st);
    std::cout << inputAsInt << std::endl;
    return 0;
}