std::string
をsize_t
に変換する方法はありますか?問題は、size_t
がプラットフォーム依存型であることです(これはsizeof
の結果です)。したがって、string
をunsigned long
またはunsigned int
に正しく変換できるとは保証できません。
編集:簡単なケースは次のとおりです:
std::cout<< "Enter the index:";
std::string input;
std::cin >> input;
size_t index=string_to_size_t(input);
//Work with index to do something
scanf
タイプのアプローチでは、%zd
をフォーマット指定子として使用できます。
または、std::stringstream
を>>
にオーバーロードするsize_t
を使用します。
std::stringstream
std::string string = "12345";
std::stringstream sstream(string);
size_t result;
sstream >> result;
std::cout << result << std::endl;
size_t
がexisting整数のtypedef、つまりunsigned int
、unsigned long
、またはunsigned long long
のいずれかと同じ幅であると、しばらく考えてみましょう。
AFAIR it could標準的な言い回しに関する限り、別の(より大きな)タイプであるが、私はその可能性は非常に低いと考えている。
size_t
がunsigned long long
よりも大きいではないという仮定を使用して、 stoull または strtoull のいずれかでsize_t
にキャストすると機能します。
同じ仮定(size_t
またはunsigned long
のいずれかで定義されたunsigned long long
)から、wouldそのタイプのoperator>>
オーバーロードが存在します。
#include <sstream>
std::istringstream iss("a");
size_t size;
iss >> size;
Iss.fail()を使用して、失敗を確認します。 ( "a")の代わりに、変換する値を使用します。
/**
* @brief Convert const char* to size_t
* @note When there is an error it returns the maximum of size_t
* @param *number: const char*
* @retval size_t
*/
size_t to_size_t(const char *number) {
size_t sizeT;
std::istringstream iss(number);
iss >> sizeT;
if (iss.fail()) {
return std::numeric_limits<size_t>::max();
} else {
return sizeT;
}
}