2

C/C++ で暗黙のキャストを無効にすることは可能ですか?

入力のみにする有効性関数を書きたいとします。integers in range [1,10]

私は書いた:

#include <iostream>


using namespace std;

int main( )
{
    int var=0;
    cout << "Enter a number (Integer between 1 to 10) : ";

    while( (!(cin >> var )) || (var > 10 ) || (var < 1) )
    {
        cout << "U nuts .. It can only be [1,10]\n";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        cout << "Enter a number (Integer between 1 to 10) : ";
        }

    cout << "\nYou entered : " << var;

   return 0;
}

しかし、ユーザーが 9.5 を入力すると、float 9.5 を 9 に変換して var に格納することで受け入れられます。float エントリを無効なエントリとして扱いたい。これを最もコンパクトに達成するにはどうすればよいですか。

私はこの種のことをしたくありません:

#include <iostream>
#include <cmath>


using namespace std;

int main( )
{
    float var=0;
    cout << "Enter a number (Integer between 1 to 10) : ";

    while( (!(cin >> var )) ||(var < 1)|| (var > 10 ) || !(ceilf(var) == var) )
    {
        cout << "U nuts .. It can only be [1,10]\n";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        cout << "Enter a number (Integer between 1 to 10) : ";
        }

    cout << "\nYou entered : " << var;

   return 0;
}

これは私の目的を果たします。しかし、私が知りたいのは、float から int への変換が抑制されるか、誤った入力として表示される可能性があるということです。

cin >> varvar タイプの場合と同様に、int入力するcharと false 条件が返されます。floatエントリーでも同じことを達成できますか?

ありがとう

4

2 に答える 2

6

しかし、ユーザーが 9.5 を入力すると、float 9.5 を 9 に変換して var に格納することで受け入れられます。

いいえ、そうではありません。ユーザーがを入力する9.5と、cin >> varにヒットしたときに読み取りが停止します.(ストリームに残されます)。を読み取っていないため、float から int への変換はありませfloatint

修正は、残りの入力 ( の後cin >> var) を読み取り、 の終了後に何も悪いものが残っていないことを確認することintです。

于 2013-04-29T11:40:35.560 に答える
1

すべての入力を検証したい場合は、最初に行全体を取得する必要があります。

試す:

string line;
getline(cin, line); // gets whole line
char *endptr;
long int var = strtol(line.c_str(), &endptr, 10); // converts string to int

// now check that endptr points to end of the string
if (endptr<line.c_str()+line.length()) {
  // extra characters found after the integer
}
于 2013-04-29T11:04:49.663 に答える