3

私はC++が初めてです。私は、コンソールを介してユーザーからほとんどの整数を読み取る必要があるプロジェクトに取り組んでいます。誰かが数字以外の文字を入力するのを避けるために、入力を文字列として読み取り、数字だけが含まれていることを確認してから整数に変換することを考えました。整数を数回チェックする必要があるため、関数を作成しました。

bool isanInt(int *y){
    string z;
    int x;
    getline(cin,z);
    for (int n=0; n < z.length(); n++) {
        if(!((z[n] >= '0' && z[n] <= '9') || z[n] == ' ') ){
            cout << "That is not a valid input!" << endl;
            return false;
        }
    }
    istringstream convert(z); //converting the string to integer
    convert >> x;
    *y = x;
    return true;
}

ユーザーが整数を入力する必要がある場合は、この関数を呼び出します。しかし、何らかの理由でこの関数を呼び出すと、プログラムは入力を待機せず、空の文字列を処理する for ループにすぐにジャンプします。何かご意見は?ご協力いただきありがとうございます。

4

6 に答える 6

9

数字のみの文字列をテストする方法はたくさんあります。一つは

bool is_digits(const std::string &str) {
    return str.find_first_not_of("0123456789") == std::string::npos;
}
于 2013-10-30T09:42:09.340 に答える
3

これはうまくいきます:

#include <algorithm> // for std::all_of
#include <cctype>    // for std::isdigit

bool all_digits(const std::string& s)
{
  return std::all_of(s.begin(), 
                     s.end(), 
                     [](char c) { return std::isdigit(c); });
}
于 2013-10-30T10:14:47.097 に答える
2

文字列を try/catch ブロックでキャストして、キャストが失敗した場合に例外を発生させ、コンソールに好きなように書き込むことができます。

例えば:

  try
  {
    int myNum = strtoint(myString);
  }
  catch (std::bad_cast& bc)
  {
     std::cerr << "Please insert only numbers "<< '\n';
  }
于 2013-10-30T09:41:44.777 に答える
-2

cin.getline(str,sizeof(str)) のような別の方法を試してください。str は char* です。この関数を呼び出す前に、他の関数が問題を引き起こしている可能性があると思います。コードの他の部分を注意深く調べることができるかもしれません。ブレークポイントの設定もお勧めです。

于 2013-10-30T09:53:55.690 に答える
-3

常に既製の機能を使用してください。一人で書くことはありません。std::regexをお勧めし ます

楽しみ。

于 2013-10-30T09:43:17.423 に答える