将字符串转换为 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 longunsigned 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 &gt;&gt; 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_tstd::basic_istringstream 是否存在重载的operator &gt;&gt;。见here。

【讨论】:

我必须使用 %Iu 说明符,但我在 Windows 系统上开发。见Working with the type size_t in the functions prinft, scanf and similar functions【参考方案3】:

让我们假设size_t 是一个现有 整数的typedef,即与unsigned intunsigned longunsigned long long 的宽度相同。

AFAIR 它可能就标准措辞而言是一个单独的(更大的)类型,但我认为这不太可能。

假设size_t大于 unsigned long long,stoull 或strtoull 并随后转换为size_t 应该可以工作。


根据相同的假设(size_t 定义为 unsigned longunsigned long long),对于该类型有一个 operator&gt;&gt; 重载。

【讨论】:

这正是我现在正在做的......但我想知道是否有更清洁的解决方案 我很喜欢%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,它会将&gt;&gt; 重载到size_t

【讨论】:

我怀疑std::size_t 是否存在过载的operator &gt;&gt;。见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 *' -- 为啥?

在C++中,如何把字节数组转换成字符串

字符串 (const char*, size_t) 到 int?

将 opengl Window 转换为 std::size_t 并再次在 Linux 中有效,但在 OS X 中无效

在 C++ 中从 size_t 转换/转换为 uint8_t?

iconv