如何从字符串中提取数字字段?

时间:2019-12-23 22:06:26

标签: c++ string

我面临的问题如下:

我有一个字符串,其中包含以下固定信息中的信息。

club {
level: 210
league: 128
staff: 1451
salary: 3452600
}
club {
level: 211
league: 121
staff: 1451
salary: 3452600
}
... and many more club {...}

我有很多club的条目。我希望能够以以下格式从字符串中的所有club中提取所有数字。

所需的输出:

2101281451345260021112114513452600

我在字符串中有信息,但是我无法理解如何有效地从字符串中删除重复字段,例如level:, league:, staff:, club:, salary:, club {}

对于实现这一目标的简单算法,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

您无需将数字视为数字,将它们视为字符就足够了。

要检查字符是否为数字,请使用isdigit

str = ...;
for (char c: str)
    if (isdigit(c))
        std::cout << c;

答案 1 :(得分:1)

您可以使用erase-remove idiom

#include <algorithm>
#include <string>
#include <cctype>

int main()
{
    std::string input = "club {"\
        "level: 210"\
        "league : 128"\
        "staff : 1451"\
        "salary : 3452600"\
        "}";

    input.erase(std::remove_if(input.begin(), input.end(), [](char c) { return !std::isdigit(c); }),
        input.end());
    //string is now "21012814513452600"
    return 0;
}

这将从您的字符串中删除所有非数字。

答案 2 :(得分:0)

将数字提取为数字的一种方法:您可以将所有不需要的字符替换为空格,然后使用stringstream从字符串中获取数字:

std::string str = ...;
std::string temp = str; // avoid overwriting the original string
for (char& c: temp) // '&' gives you permission to change characters
    if (!isdigit(c))
        c = ' ';
std::stringstream stream(tmp);
int i;
while (stream >> i)
    std::cout << i; // print it or do whatever else