【问题标题】:convert string to size_t将字符串转换为 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 是什么意思您是否要转换一串数字?请发布一些代码并解释您的要求
  • 是什么阻止了某人输入超过您的数字限制的巨大数字?
  • 这又是一个问题。目前是否有适用于 size_t 的类似 stol 的方法
  • 只做size_t index; cin &gt;&gt; index;有什么问题?

标签: c++ string c++11 size-t


【解决方案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

    【讨论】:

    【解决方案3】:

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

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

    假设size_t大于 unsigned long longstoullstrtoull 并随后转换为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;
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2012-05-17
      • 2020-05-01
      • 2019-10-10
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      相关资源
      最近更新 更多