有没有办法将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
答案 0 :(得分:9)
您可能希望sscanf
使用%zu
说明符,std::size_t
。
sscanf(input.c_str(), "%zu", &index);
看看here。
从字面上看,我怀疑operator >>
std::basic_istringstream
的{{1}}超载std::size_t
。请参阅here。
答案 1 :(得分:7)
您可以使用std::stringstream
std::string string = "12345";
std::stringstream sstream(string);
size_t result;
sstream >> result;
std::cout << result << std::endl;
答案 2 :(得分:6)
您可以使用%zd
作为scanf
类型方法中的格式说明符。
或者使用会std::stringstream
重载>>
的{{1}}。
答案 3 :(得分:4)
让我们假设一分钟size_t
是现有整数的typedef,即与unsigned int
,unsigned long
或{的宽度相同{1}}。
AFAIR,就标准措辞而言,它可能是一个单独的(更大的)类型,但我认为这是非常不可能的。
使用unsigned long long
不是大于而不是size_t
的假设,stoull或strtoull随后转换为{{1}应该工作。
根据相同的假设(unsigned long long
定义size_t
或size_t
),将成为unsigned long
重载类型。
答案 4 :(得分:1)
#include <sstream>
std::istringstream iss("a");
size_t size;
iss >> size;
通过使用iss.fail(),您可以检查失败。 而不是(&#34; a&#34;),而是使用您想要转换的值。
答案 5 :(得分:0)
/**
* @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;
}
}