web-dev-qa-db-ja.com

cin入力ストリームをチェックすると整数が生成されます

これを入力すると、変数になる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;

}
13
user2766546

次のように確認できます。

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;
}

編集:10abcなどの入力に関する以下のコメントに対処するには、ループを変更して入力として文字列を受け入れることができます。次に、数字ではなく任意の文字の文字列を確認し、それに応じてその状況を処理します。そのような状況では、入力ストリームをクリア/無視する必要はありません。文字列が単なる数字であることを確認し、文字列を整数に変換します。つまり、これはカフから外れていたということです。もっと良い方法があるかもしれません。 float/doublesを受け入れている場合、これは機能しません(検索文字列に「。」を追加する必要があります)。

#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;
}
26
Chemistpp

Cにはisdigit()と呼ばれる関数があります。それはあなたにぴったりです。例:

int var1 = 'h';
int var2 = '2';

if( isdigit(var1) )
{
   printf("var1 = |%c| is a digit\n", var1 );
}
else
{
   printf("var1 = |%c| is not a digit\n", var1 );
}
if( isdigit(var2) )
{
  printf("var2 = |%c| is a digit\n", var2 );
}
else
{
   printf("var2 = |%c| is not a digit\n", var2 );
}

ここ から

1
nook

Istreamが挿入に失敗すると、失敗ビットが設定されます。

int i = 0;
std::cin >> i; // type a and press enter
if (std::cin.fail())
{
    std::cout << "I failed, try again ..." << std::endl
    std::cin.clear(); // reset the failed state
}

Do-whileループでこれを設定して、適切に挿入された正しいタイプ(この場合はint)を取得できます。

詳細: http://augustcouncil.com/~tgibson/tutorial/iotips.html#directly

1
Zac Howland

へー、これはより良い答えを使用できる古い質問です。

ユーザー入力はstringとして取得し、次にattempt-convertedとして目的のデータ型に取得する必要があります。便利なことに、これにより、「私の入力はどのタイプのデータですか?」などの質問に答えることもできます。

これは私がよく使う機能です。 Boostのような他のオプションもありますが、基本的な前提は同じです:文字列→型変換を実行し、成功または失敗を観察してみてください:

template <typename T>
std::optional <T> string_to( const std::string& s )
{
  std::istringstream ss( s );
  T result;
  ss >> result >> std::ws;      // attempt the conversion
  if (ss.eof()) return result;  // success
  return {};                    // failure
}

optionalタイプを使用するのは1つの方法にすぎません。失敗時に例外をスローしたり、デフォルト値を返すこともできます。あなたの状況に合ったものなら何でも。

以下に使用例を示します。

int n;
std::cout << "n? ";
{
  std::string s;
  getline( std::cin, s );
  auto x = string_to <int> ( s );
  if (!x) return complain();
  n = *x;
}
std::cout << "Multiply that by seven to get " << (7 * n) << ".\n";

制限とタイプ識別

これが機能するためには、もちろん、ストリームからデータ型を明確に抽出するメソッドが存在する必要があります。これは、C++における物事の自然な順序です。つまり、通常どおりのビジネスです。だからここで驚きはありません。

次の注意点は、一部のタイプが他のタイプを包含していることです。たとえば、intdoubleを区別しようとする場合、intに変換されるものはすべてintでもあるため、最初にdoubleを確認してください。 。

1
Dúthomhas

変数名自体を使用して、値が整数かどうかを確認できます。例えば:

#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;

if(firstvariable && secondvariable){
    cout << "Time for some simple mathematical operations:\n" << endl;

    cout << "The sum:\n " << firstvariable << "+" << secondvariable 
    <<"="<< firstvariable + secondvariable << "\n " << endl;
}else{
    cout << "\n[ERROR\tINVALID INPUT]\n"; 
    return 1; 
} 
return 0;    
}
0
user6090272