だから私は文字列を短いものに変換する方法を探し回って、文字列を整数に変換する方法についてたくさん見つけました。それらのスレッドにコメントとして質問を残しますが、私には十分な評判がありません。だから、私がやりたいのは、文字列をshortに変換することです。なぜなら、数値が3を超えたり、0を下回ったりしてはならず、shortはメモリを節約するからです(私が知る限り)。
明確にするために、私はASCIIコードを参照していません。
私ができるようにしたいもう1つのことは、ユーザー入力で構成される文字列を使用するため、文字列からshortへの変換が失敗するかどうかを確認することです。
Whileループでこれを実行できることはわかっていますが、C++でこれを実行するための組み込み関数があり、whileループと同じかそれ以上の効率がある場合は、ぜひお知らせください。
基本的に、std::stos
関数は不明な理由で欠落していますが、簡単に自分でロールすることができます。 std::stoi
を使用してint
に変換し、たとえば次のように指定されたshort
境界に対して値を確認します。 std::numeric_limits<short>
、範囲内にない場合はstd::range_error
をスローし、そうでない場合はその値を返します。そこ。
Boostライブラリがすでにインストールされている場合は、便宜上boost::lexical_cast
を使用できますが、それ以外の場合は避けます(主に冗長性とライブラリのため)依存、 そしてそれはまた少し非効率的です)。
以前のboost::lexical_cast
はあまり効率的ではないことで知られていました。これは内部的に文字列ストリームに基づいていたためだと思いますが、ここのコメントで報告されているように、最新バージョンは 文字列ストリームによる変換よりも高速ですscanf
経由よりも重要です。
効率的な方法 は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
}
ssprintf
を%hi
フォーマット指定子とともに使用することもできます。
例:
short port;
char szPort[] = "80";
sscanf(szPort, "%hi", &port);
数値が3を超えたり0を下回ったりすることはありません
本当に本当にメモリを節約する必要がある場合、これもcharに収まります(charが符号付きか符号なしかに関係なく)。
もう1つの「極端な」トリック:「002」のような奇妙なものがないと信頼できる場合、あなたが持っているのは単一の文字列です。その場合、本当にパフォーマンスが必要な場合は、次を試してください。
char result = (char)( *ptr_c_string - '0' );