我记得C或C ++中的一个函数可以做这样的事情:
string = "Hello my name is: 1234567 have a good day!"
function(string, "Hello my name is: %s have a good day!", substring)
和子字符串将是1234567
。 function
是什么?
答案 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
提供了更多的控制,只需要更多的工作。
超越正则表达式会在解析时达到。
此解决方案使用C ++ 11功能。有些编译器的<regex>
标头基本上都是存根,所以请检查编译器支持。