【问题标题】:Sscanf delimiters for parsing?用于解析的 Sscanf 分隔符?
【发布时间】:2012-12-07 05:28:28
【问题描述】:

我正在尝试使用 sscanf 解析以下字符串:

query=testword&diskimg=simple.img

如何使用 sscanf 解析出“testword”和“simple.img”? sscanf 的分隔符参数真的让我很困惑:/

谢谢!

【问题讨论】:

    标签: c parsing scanf


    【解决方案1】:

    如果你知道“testword”的长度总是8个字符,你可以这样做:

    char str[] = "query=testword&diskimg=simple.img";
    char buf1[100];
    char buf2[100];
    
    sscanf(str, "query=%8s&diskimg=%s", buf1, buf2);
    

    buf1 现在将包含“testword”,而 buf2 将包含“simple.img”。

    或者,如果您知道 testword 将始终以 = 开头,后跟 &,并且 simple.img 将始终以 = 开头,您可以使用:

    sscanf(str, "%*[^=]%*c%[^&]%*[^=]%*c%s", buf1, buf2);
    

    它非常神秘,所以总结一下:每个 % 表示一段文本的开头。如果在 % 之后有一个 *,这意味着我们忽略该块并且不将其存储在我们的缓冲区之一中。括号内的 ^ 表示该块包含任意数量的不是括号内字符的字符(^ 本身除外)。 %s 读取任意长度的字符串,%c 读取单个字符。

    总结一下:

    • 如果字符不是 =,我们会继续读取并忽略它们。
    • 我们读取并忽略另一个字符(等号)。
    • 现在我们在 testword,所以我们一直在读取字符并将其存储到 buf1 中,直到遇到 & 字符。
    • 更多字符可供阅读和忽略;我们继续前进,直到我们再次点击 =。
    • 我们读取并忽略单个字符(同样是等号)。
    • 最后,我们将剩下的内容(“simple.img”)存储到 buf2 中。

    【讨论】:

    • 非常优雅的解决方案,我喜欢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多