0

数値かどうかを確認するために使用しているコードkeyは次のとおりです。

string key;
cin>>key;
if(isalpha(atoi(key.c_str())) == 0)
{
     //do something
}
else
    //do something else

何を入力しても、isalpha常に== 0. を使用してブール値のように扱ってみましif(isalpha(atoi(key.c_str())))たが、同じことを行います。

キーは であるはずですが、intどちらも機能cin.fail()!(cin>>key)ませんでした。

4

5 に答える 5

2

あなたのコードでkeyは、C++ 文字列です。

string key;

これにより、C++ 文字列が C 文字列に変換されます。

key.c_str()

これは、C 文字列を数値に変換します。整数。(0値が変換できない場合)

atoi(key.c_str())

そして、これはその数字が文字のASCIIコードかどうかをチェックします

isalpha(atoi(key.c_str()))

C++ 文字列を C 文字列、整数、ASCII 値に変換し、その値がアルファベットの文字かどうかを確認します (数字かどうかはわかりませんが、「文字」であるかどうかだけがわかります)。または「手紙ではない」)

作成した if ステートメントは、ユーザーが文字の ASCII 数値ではない何かを入力した場合にのみ true になります。たとえば、入力65するとelse節に移動し65ます。'A'

@chris が親切に提供してくれる提案を試してください。

try
{
    int the_number = std::stoi(key);
    //do something
}
catch( std::exception& )
{
    //do something else
}
于 2013-03-02T23:51:48.140 に答える
0

入力が数値かどうかをテストする必要がある場合-:

string key;
cin>>key;
if (key.size() && isalpha(*(key.c_str()))
{
    //do something with non-numeric input
}
else
    // numeric input, use atoi to get integer value
于 2013-03-02T23:58:09.117 に答える
0

atoi文字列に数値が含まれているかどうかを判断するために使用することは、あまり幸運な選択ではないことに注意してください。文字列に数字のみが含まれていることを確認したい場合は、その文字を繰り返し処理して各文字を確認するのが最善の方法です(を使用できますstd::isdigit)。

次に、この文字列から整数値を抽出するために、C ++ 11では、を使用std::stoiできます。それ以外の場合は、次を使用できます std::istringstream

int val;
std::string key;
// ...
if (std::istringstream(key) >> val)
{
    // success
}
else
{
    // failure
}

これは、数値を表す文字列で始まると成功します。したがって、、などのkey文字列でも機能します。特定の状況によって異なりますが、この場合は事前の検証も必要ない場合があります。42abc0x21zzz

役立つかもしれない関連する質問:文字列がC ++の数値であるかどうかを判断する方法は?

于 2013-03-02T23:59:14.757 に答える
0

内容のないキーを定義しており、空の配列への char ポインターを返す場合は、その t_str メソッドをすぐに使用します。したがって、atoi は常に 0 を返します。

ここを参照してください http://www.cplusplus.com/reference/cstdlib/atoi/

与えられた例では、キーが空であり、atoi パラメータが無効であるため、atoi は常にゼロを返します。

于 2013-03-02T23:40:20.273 に答える
0

@suspectus が行ったように、文字列内の各文字を反復処理してisDigit代わりに使用することを除いて、それは考えない!@、数値です。

for(int i = 0; i<key.size(); i++)
{
   if(!(isdigit(key[i])))
   {
      //fails
   }
}
于 2013-03-03T01:13:11.427 に答える