从没有空格的字符串中读取整数

Posted

技术标签:

【中文标题】从没有空格的字符串中读取整数【英文标题】:Reading integers from a string with no space 【发布时间】:2016-10-07 22:03:14 【问题描述】:

我正在尝试从字符串中读取数字,例如 如果

string str = "1Hi15This10";

我想得到 (1,15,10)

我按索引尝试了,但我将 10 读为 1 和 0 而不是 10。 我无法使用getline,因为字符串没有被任何东西分隔。

有什么想法吗?

【问题讨论】:

这可能会对您有所帮助:***.com/questions/17331250/… 您熟悉使用正则表达式进行匹配吗?您可以使用/(\d+)/g 之类的东西来匹配字符串中的整数组,然后在作为组返回的字符串中解析出整数本身。 【参考方案1】:

没有正则表达式你可以这样做

std::string str = "1Hi15This10";
for (char *c = &str[0]; *c; ++c)
   if (!std::isdigit(*c) && *c != '-' && *c != '+') *c = ' ';

整数现在由一个易于解析的空格分隔符分隔

【讨论】:

也可以使用!std::isdigit(*c),也可以应付非字母。还可能需要调整方法以允许存在符号字符(+-)。 这可能会调用未定义的行为。 Details【参考方案2】:

恕我直言,最好的方法是使用正则表达式。

#include <iostream>
#include <iterator>
#include <string>
#include <regex>

int main() 
    std::string s = "1Hi15This10";

    std::regex number("(\\d+)");  // -- match any group of one or more digits

    auto begin = std::sregex_iterator(s.begin(), s.end(), number);

    // iterate over all valid matches  
    for (auto i = begin; i != std::sregex_iterator(); ++i) 
        std::cout << "  " << i->str() << '\n';
        // and additional processing, e.g. parse to int using std::stoi() etc.
    

输出:

  1
  15
  10

Live example here on ideone.

是的,您可以为此编写自己的循环,但是:

    你可能会在某个地方犯一些愚蠢的错误, 正则表达式可以适应多种不同的搜索模式;例如如果 tmr 你决定要支持十进制/负数/浮点数怎么办?使用正则表达式可以轻松支持这些情况和许多其他情况,而您的自定义解决方案可能不会那么多:)

【讨论】:

以上是关于从没有空格的字符串中读取整数的主要内容,如果未能解决你的问题,请参考以下文章

从没有空格的字符串中提取多个日期的简单方法? [关闭]

正则表达式从没有扩展名的文件名中查找空格和括号

在c ++中输入n个空格分隔的整数

如何从字符串变量中获取读取为整数的 CSV 整数

如何在 C++ 中读取由空格分隔的字符串? [关闭]

从c中的复杂字符串中读取整数