【问题标题】:sscanf make ignore all symbols including newlinesscanf 忽略所有符号,包括换行符
【发布时间】:2015-11-07 14:23:12
【问题描述】:

我有一个字符串,其中包含来自文件的数据,这里是示例

string str = "File:./img/Char2.png\r\n
Size:128x128\r\n
Frames:2\r\n
Hand:79x54\r\n
Horizontal_Animated:0"

我希望使用这个字符串来初始化变量,但是遇到了一个问题: 我想使用sscanf(str.c_str(),"%*s Size:%dx%d",&Width,&Height) 解析这个字符串并且它可以工作,但是我不喜欢一件事: 对于第二个,第三个......sscanf 的调用我需要再添加一个%*s,因为这个东西不会忽略\r\n,所以下一个代码如下所示:

sscanf(contents.c_str(),"%*s %*s Frames:%d",&MaxFrames);
sscanf(contents.c_str(),"%*s %*s %*s Hand:%dx%d",&HandX,&HandY)

那么,我如何在没有大量 %*s 的情况下更改格式字符串以进行正确解析?

ps。我知道 C++11 中的正则表达式,但我对解决方案很好奇

【问题讨论】:

  • 那么,我如何在没有大量 %*s 的情况下更改格式字符串才能正确解析? 简单:不要使用 sscanf。 C++11 有正则表达式。

标签: c++ string parsing scanf


【解决方案1】:

由于数据已经在std::string 中,我将首先使用std::stringstreamstd::getline 将整个字符串分成几行。完成后,sscanf 足以解析各个行。

拆分的 C 标准库方法是使用 strtok。但是当它修改字符串时,您不能直接在std.c_str() 上使用它。您必须先使用strdup 制作可修改的副本。

当然,这里可以考虑正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多