【问题标题】: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,因为字符串没有被任何东西分隔。

有什么想法吗?

【问题讨论】:

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

标签: c++ string


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2011-09-11
    • 2015-05-14
    相关资源
    最近更新 更多