将字符串转换为 size_t
Posted
技术标签:
【中文标题】将字符串转换为 size_t【英文标题】:convert string to size_t 【发布时间】:2016-03-06 18:17:47 【问题描述】:有没有办法将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
【问题讨论】:
将string
转换为size_t
是什么意思您是否要转换一串数字?请发布一些代码并解释您的要求
看看en.cppreference.com/w/cpp/string/basic_string/stol
是什么阻止了某人输入超过您的数字限制的巨大数字?
这又是一个问题。目前是否有适用于 size_t 的类似 stol 的方法
只做size_t index; cin >> index;
有什么问题?
【参考方案1】:
你可以使用std::stringstream
std::string string = "12345";
std::stringstream sstream(string);
size_t result;
sstream >> result;
std::cout << result << std::endl;
【讨论】:
【参考方案2】:您可能希望将sscanf
与%zu
说明符一起使用,该说明符用于std::size_t
。
sscanf(input.c_str(), "%zu", &index);
看看here。
从字面上看,我怀疑std::size_t
的std::basic_istringstream
是否存在重载的operator >>
。见here。
【讨论】:
我必须使用%Iu
说明符,但我在 Windows 系统上开发。见Working with the type size_t in the functions prinft, scanf and similar functions【参考方案3】:
让我们假设size_t
是一个现有 整数的typedef,即与unsigned int
、unsigned long
或unsigned long long
的宽度相同。
AFAIR 它可能就标准措辞而言是一个单独的(更大的)类型,但我认为这不太可能。
假设size_t
不大于 unsigned long long
,stoull 或strtoull 并随后转换为size_t
应该可以工作。
根据相同的假设(size_t
定义为 unsigned long
或 unsigned long long
),将对于该类型有一个 operator>>
重载。
【讨论】:
这正是我现在正在做的......但我想知道是否有更清洁的解决方案 我很喜欢%zd
:这是自 C99 标准以来一直存在的。不确定 C++,但我想它已经存在了同样多的时间。
@Bathsheba:我对整个*scanf()
家庭有一种深深的、几乎是遗传的厌恶。我碰巧实现了它们,所以这不是因无知而厌恶,而是恰恰相反。我可能会在紧要关头使用它们,但你永远不会看到我向任何人推荐它们,尤其是在 C++ 上下文中。 ;-)
我同意你的观点,尽管我不能声称自己已经实现了这个家庭。但我确实觉得这种特殊情况是规则的例外。加一,因为您的回答显然包含隐藏的深度
@Bathsheba:Related SO question by myself, back from when I was implementing *scanf()
。总结是输入字符串"0xz"
,如果被*scanf()
解析,是匹配失败未定义参数(输入指针位于'x'
...)——除非,当然,您正在查看不兼容的实现,例如 glibc-2.8 或 newlib 1.14。 ;-) 那是唯一让我厌恶*scanf()
的一 件事。 ;-)【参考方案4】:
您可以使用%zd
作为scanf
类型方法中的格式说明符。
或者使用std::stringstream
,它会将>>
重载到size_t
。
【讨论】:
我怀疑std::size_t
是否存在过载的operator >>
。见here。
据我了解,size_t 没有重载...但由于 Size_t 是 uint 或 ulong 或 ulongong... 它适用于正确的 size_t 类型?
就 std::size_t 可能(也许肯定;需要检查)根据原始整数类型之一定义的范围内,会有。否则会导致编译错误。
@Bathsheba:我这里只有 C99 论文,但这并没有说明 size_t
,除非它被定义为无符号整数类型,返回类型为 @987654330 @,且最大值 (SIZE_MAX
) 不小于 65535。
size_t
的正确说明符是 %zu
,而不是 %zd
。【参考方案5】:
#include <sstream>
std::istringstream iss("a");
size_t size;
iss >> size;
通过使用iss.fail(),您可以检查失败。 使用您要转换的值,而不是 ("a")。
【讨论】:
我认为你的意思是>>,而不是>。【参考方案6】:/**
* @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;
【讨论】:
以上是关于将字符串转换为 size_t的主要内容,如果未能解决你的问题,请参考以下文章
无法将参数 5 从 'SIZE_T *' 转换为 'size_t *' -- 为啥?
字符串 (const char*, size_t) 到 int?
将 opengl Window 转换为 std::size_t 并再次在 Linux 中有效,但在 OS X 中无效