web-dev-qa-db-ja.com

C ++で文字列をshortに変換する

だから私は文字列を短いものに変換する方法を探し回って、文字列を整数に変換する方法についてたくさん見つけました。それらのスレッドにコメントとして質問を残しますが、私には十分な評判がありません。だから、私がやりたいのは、文字列をshortに変換することです。なぜなら、数値が3を超えたり、0を下回ったりしてはならず、shortはメモリを節約するからです(私が知る限り)。

明確にするために、私はASCIIコードを参照していません。

私ができるようにしたいもう1つのことは、ユーザー入力で構成される文字列を使用するため、文字列からshortへの変換が失敗するかどうかを確認することです。

Whileループでこれを実行できることはわかっていますが、C++でこれを実行するための組み込み関数があり、whileループと同じかそれ以上の効率がある場合は、ぜひお知らせください。

8
Logan Kling

基本的に、std::stos関数は不明な理由で欠落していますが、簡単に自分でロールすることができます。 std::stoiを使用してintに変換し、たとえば次のように指定されたshort境界に対して値を確認します。 std::numeric_limits<short>、範囲内にない場合はstd::range_errorをスローし、そうでない場合はその値を返します。そこ。

Boostライブラリがすでにインストールされている場合は、便宜上boost::lexical_castを使用できますが、それ以外の場合は避けます(主に冗長性とライブラリのため)依存、 そしてそれはまた少し非効率的です)。

以前のboost::lexical_castはあまり効率的ではないことで知られていました。これは内部的に文字列ストリームに基づいていたためだと思いますが、ここのコメントで報告されているように、最新バージョンは 文字列ストリームによる変換よりも高速ですscanf経由よりも重要です。

11

効率的な方法boost::lexical_castを使用することです:

short myShort = boost::lexical_cast<short>(myString);

インストールする必要があります boost library そして以下が含まれます:#include <boost/lexical_cast.hpp>

キャストが失敗した場合に備えて、bad_lexical_castをキャッチする必要があります。

    try
    {
        short myShort = boost::lexical_cast<short>(myString);
    }
    catch(bad_lexical_cast &)
    {
        // Do something
    }
3
Jérôme Leducq

ssprintf%hiフォーマット指定子とともに使用することもできます。

例:

short port;
char szPort[] = "80";

sscanf(szPort, "%hi", &port);
1
John Doe

数値が3を超えたり0を下回ったりすることはありません

本当に本当にメモリを節約する必要がある場合、これもcharに収まります(charが符号付きか符号なしかに関係なく)。

もう1つの「極端な」トリック:「002」のような奇妙なものがないと信頼できる場合、あなたが持っているのは単一の文字列です。その場合、本当にパフォーマンスが必要な場合は、次を試してください。

char result = (char)( *ptr_c_string - '0' );
0
Bert Bril