我有一个半xml格式的文件,其中包含以下格式的行:
<param name="Distance" value="1000Km" />
字符串中的第一个字符通常是TAB或空格。 我一直在使用以下方法尝试解析两个字符串(从名称和值):
if(sscanf(lineread, "\t<param name=\"%s\" value=\"%s\" />", name, value) == 1)
{
//do something
}
名称和值为char *
现在,结果总是一样的:name得到解析(我需要删除引号)并且name总是为空。 我做错了什么?
谢谢,代码表示赞赏。
尔杰斯。
答案 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
。