【问题标题】:Using sscanf to parse two strings out使用 sscanf 解析出两个字符串
【发布时间】:2010-05-20 19:35:47
【问题描述】:

我有一个半 xml 格式的文件,其中包含以下格式的行:

<param name="Distance" value="1000Km" />

字符串中的第一个字符通常是 TAB 或空格。 我一直在使用以下方法尝试解析出两个字符串(从名称和值):

if(sscanf(lineread, "\t<param name=\"%s\" value=\"%s\" />", name, value) == 1)
{
    //do something
}

名称和值是 char*

现在,结果总是一样的:name 被解析(我需要删除引号)并且 name 总是空的。 我做错了什么?

谢谢,感谢代码。

杰斯。

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    像往常一样,扫描集可能是您的最佳答案:

    sscanf(lineread, "%*[^\"]\"%[^\"]\"%*[^\"]\"%[^\"]\"", name, value);
    

    当然,对于实际代码,您还希望限制转换的长度:

    #include <stdio.h>
    
    int main() { 
        char lineread[] = "<param name=\"Distance\" value=\"1000Km\" />";   
        char name[256], value[256];
    
        sscanf(lineread, "%*[^\"]\"%255[^\"]\"%*[^\"]\"%255[^\"]\"", name, value);
    
        printf("%s\t%s", name, value);
        return 0;
    }
    

    Edti:顺便说一句,sscanf 返回成功转换的次数,因此在您的原始代码中,您可能想要比较 2 而不是 1。

    Edit2:这么多:%*[^\"]\" 表示“读取并忽略引号以外的字符”,然后读取并跳过引号。下一个 %255[^\"]\" 的意思是“最多读取 255 个字符而不是引号,然后读取并跳过引号。然后重复整个模式以读取第二个字符串。

    【讨论】:

    • 那行得通。我只需要一个小小的解释。第一个 %*[^\"] 去掉第一个 "?那么 \" 是第一个“......我在这里很困惑。
    【解决方案2】:

    原始代码的问题是%s 仅在看到空格后才停止。因此,name 得到 Distance" 而不是预期的 Distance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2021-11-18
      相关资源
      最近更新 更多