2

する必要がある:

1)現在のシステムのunsignedintの最大値を見つけます。私はlimits.hでそれを見つけられませんでした。書くのは安全unsigned int maxUnsInt = 0 - 1;ですか?また、正しい値を返すように試みunsigned int maxUnsInt = MAX_INT * 2 + 1ましたが、コンパイラはintオーバーフロー操作に関する警告を表示します。

2)見つかったら、C ++文字列(数字のみで構成されていることがわかっています)がシステムのunsignedintの最大値を超えていないかどうかを確認します。

私の最終的な目的は、有効なunsigned intである場合に限り、atoiを使用して文字列をunsignedintに変換することです。標準ライブラリのみを使用したいと思います。

4

3 に答える 3

3

にあるはず#define UINT_MAXです<limits.h>; なかったらびっくりします。それ以外の場合は、次のことが保証されます。

unsigned int u = -1;

最大値になります。C ++では、を使用することもできますが std::numeric_limits<unsigned int>::max()、C ++ 11までは、それは積分定数式ではありませんでした(これは問題になる場合とそうでない場合があります)。

unsigned int u = 2 * MAX_INT + 1;

何かであることが保証されているわけではありません(少なくとも1つのシステムでは MAX_INT == UMAX_INT)。

文字列のチェックに関して、最も簡単な解決策は、を使用してstrtoulから、検証errnoして戻り値を取得することです。

bool
isLegalUInt( std::string const& input )
{
    char const* end;
    errno = 0;
    unsigned long v = strtoul( input.c_str(), &end, 10 );
    return errno == 0 && *end == '\0' && end != input.c_str() && v <= UINT_MAX;
}

C ++ 11を使用している場合は、オーバーフローを使用した場合に例外std::stoulをスローするを使用することもできます。std::out_of_range

于 2013-02-15T11:25:47.880 に答える
2

numeric_limitsさまざまな数値タイプに制限があります。

unsigned int maxUnsInt = std::numeric_limits<unsigned int>::max();

stringstream文字列をサポートする任意のタイプに読み取り、operator>>失敗したかどうかを通知できます。

std::stringstream ss("1234567890123456789012345678901234567890");

unsigned int value;
ss >> value;

bool successful = !ss.fail();
于 2013-02-15T11:14:54.210 に答える
1

これによると、それを計算する必要はありません。適切な定数を使用するだけです。この場合はそうする必要がありますUINT_MAX

いくつかのメモ。

これはC++とは対照的に、よりACのように見えますが、使用したいと言っているので、atol私はそれに固執します。numeric_limitsJoachimが提案したようにc++を使用します。ただし、c ++標準では、cのようなマクロ/定義も定義されているため、安全に使用できます。

また、c ++-wayにしたい場合stringstreamは、変換に(標準c ++ライブラリの一部である)を使用することをお勧めします。

最後に、私は意図的に明示的なコードソリューションを投稿しません。これは宿題のように見えるためです。ここから先に進んでください。

于 2013-02-15T11:07:03.710 に答える