我想在c ++中使用sscanf拆分字符串。我的字符串将是“a.b”或“a:b”或“ab”格式

时间:2016-01-15 11:28:52

标签: c++ string split scanf

main()
{
    char *tokenstring = "a.b"; 
    char o[10],s[10];
    sscanf(tokenstring, "%[^'.'].%s", o, s);
    printf("%s\n%s\n ", o, s);
}

输出:

a
b

这很好。但我的输入字符串格式各不相同

string tokenstring = a.b;

我正在寻找适用于两种输入的sscaf逻辑。 a.b或a:b或ab

还有一个条件。我有可能我的字符串可能不包含任何分隔符,这意味着单个值。在那种情况下,我希望将单个值放入某个变量中。例如:char * tokenstring =“ab”;

类似于result = sscanf(tokenstring, "%[^':']: or [^'.']. %s", o, s);

的内容

2 个答案:

答案 0 :(得分:1)

sscanf在这里太过分了,并且为您提供了无法读取的代码。只需使用std::string::find_first_of(".:")即可。未经测试的代码:

struct ab {
    std::string a;
    std::string b;
};

ab get_ab(const std::string& str) {
    std::string::size_type pos = str.find_first_of(".:");
    ab res;
    res.a = str.substring(0, pos);
    if (pos != std::string::npos)
        res.b = str.substring(pos + 1);
}

答案 1 :(得分:0)

sscanf与regexp一起使用:

  

sscanf(tokenstring,“%[^。:]%* [。:]%s”,o,s);

说明:

  • %[^.:]匹配所有不是.:的字符。
  • %*[.:]匹配所有字符.:*表示结果未被捕获到任何参数中。
  • %s匹配字符串的其余部分。