C字符串处理函数获取子字符串

时间:2015-01-27 13:24:42

标签: c++ c string

我记得C或C ++中的一个函数可以做这样的事情:

string = "Hello my name is: 1234567 have a good day!"
function(string, "Hello my name is: %s have a good day!", substring)

和子字符串将是1234567function是什么?

4 个答案:

答案 0 :(得分:4)

在C中,您可以使用sscanf()执行此操作。当然,C中没有string数据类型,但是:

#include <stdio.h>

int main(void)
{
  const char string[] = "Hello my name is: 1234567 have a good day!";

  char substring[32];
  if(sscanf(string, "Hello my name is: %31s have a good day!", substring) == 1)
  {
    printf("got '%s'\n", substring);
  }
  return 0;
}

答案 1 :(得分:2)

sscanf是您搜索的功能。

答案 2 :(得分:0)

您似乎正在尝试提取数字,而不是提取子串。

如果您的前缀字符串始终以以下格式开头:&#34;您好我的名字是:&#34;你可以这样做:

const auto size = strlen("Hello my name is: ");
int substring = stoi(string.substr(size));

如果您不确定您的前缀,那么我建议使用正则表达式:

smatch m;
regex_search(string, m, regex(".*?(-?\\d+)"));
int substring = stoi(m[1]);

答案 3 :(得分:0)

你可能正在寻找sscanf,但你可能想要C ++正则表达式。

std::regex开始:

std::regex re( "Hello my name is: \b(\w+)\b have a good day!" );

然后把它放到一个函数中:

std::string get_name( std::string const& src ) {
  static std::regex re( R"-(Hello my name is: (\w+) have a good day!)-" ); 
  std::smatch results;
  bool bworked = std::regex_match( src, results, re );
  if (!bworked) return {};
  // Assert(results.size() >= 2);
  if (results.size() < 2) return {};
  return results.str(1);
}

这比sscanf提供了更多的控制,只需要更多的工作。

live example

超越正则表达式会在解析时达到。

此解决方案使用C ++ 11功能。有些编译器的<regex>标头基本上都是存根,所以请检查编译器支持。