如何在C ++中搜索std :: string中的子字符串?

时间:2008-12-06 21:59:53

标签: c++ string

我正在尝试用C ++解析一个简单的字符串。我知道字符串包含一些带冒号的文本,紧接着是一个空格,然后是一个数字。我想只提取字符串的数字部分。我不能只是在空间上进行标记(使用sstream和<<),因为冒号前面的文本可能有也可能没有空格。

一些示例字符串可能是:

  

总磁盘空间:9852465

     

可用磁盘空间:6243863

     

部门:4095

我想使用标准库,但如果您有其他解决方案,也可以发布,因为其他有相同问题的人可能希望看到不同的解决方案。

6 个答案:

答案 0 :(得分:14)

std::string strInput = "Total disk space: 9852465";
std::string strNumber = "0";
size_t iIndex = strInput.rfind(": ");
if(iIndex != std::string::npos && strInput.length() >= 2)
{
  strNumber = strInput.substr(iIndex + 2, strInput.length() - iIndex - 2)
}

答案 1 :(得分:8)

为了完整起见,这是C中的一个简单解决方案:

int value;
if(sscanf(mystring.c_str(), "%*[^:]:%d", &value) == 1)
    // parsing succeeded
else
    // parsing failed

说明:%*[^:]表示要读入非冒号的可能字符,而*会禁止分配。然后,在冒号和任何插入的空格之后读入整数。

答案 2 :(得分:4)

  

我不能仅仅在空间上进行标记(使用sstream和<<),因为冒号前面的文本可能包含也可能没有空格。

是的,但您可以使用std::getline

string not_number;
int number;
if (not (getline(cin, not_number, ':') and cin >> number)) {
    cerr << "No number found." << endl;
}

答案 3 :(得分:3)

类似于Konrads的答案,但使用istream::ignore

int number;
std::streamsize max = std::numeric_limits<std::streamsize>::max();
if (!(std::cin.ignore(max, ':') >> number)) {
    std::cerr << "No number found." << std::endl;
} else {
    std::cout << "Number found: " << number << std::endl;
}

答案 4 :(得分:3)

我很惊讶没有人提到正则表达式。它们作为TR1的一部分添加,也包含在Boost中。这是使用正则表达式的解决方案

typedef std::tr1::match_results<std::string::const_iterator> Results;

std::tr1::regex re(":[[:space:]]+([[:digit:]]+)", std::tr1::regex::extended);
std::string     str("Sectors: 4095");
Results         res;

if (std::tr1::regex_search(str, res, re)) {
    std::cout << "Number found: " << res[1] << std::endl;
} else {
    std::cerr << "No number found." << std::endl;
}

看起来更多的工作,但你从中得到更多恕我直言。

答案 5 :(得分:2)

const std::string pattern(": ");
std::string s("Sectors: 4095");
size_t num_start = s.find(pattern) + pattern.size();