使用sscanf解析两个字符串

时间:2010-05-20 19:35:47

标签: c scanf

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

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

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

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

名称和值为char *

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

谢谢,代码表示赞赏。

尔杰斯。

2 个答案:

答案 0 :(得分:5)

像往常一样,扫描设置可能是您最好的答案:

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:BTW,sscanf会返回成功转换的次数,因此在您的原始代码中,您可能希望与2而不是1进行比较。

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

答案 1 :(得分:1)

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