2012-11-09 76 views
0

我有这种输入数据。从输入字符串解析数据

<html>...... <!-- OK -->

我只希望注释符号<!--之前提取数据。 这是我的代码:

char *parse_data(char *input) { 
    char *parsed_data = malloc(strlen(input) * sizeof(char)); 
    sscanf(input, "%s<!--%*s", parsed_data); 
    return parsed_data; 
} 

但是,它似乎并没有返回预期的结果。我无法弄清楚为什么是这样。

任何人都可以解释我提取这种数据和'sscanf()`行为的正确方法。

谢谢!

回答

4

"%s"格式说明符不会将"<!--"作为单个分隔符,或任何单个字符作为分隔符(反正这不会是正确的行为)。只有空格被认为是分隔符。扫描集可在sscanf()中获得,但它们会收集单个字符的集合,而不是代表单个分隔符的字符序列。这意味着在第一个空格字符前input中的所有内容都将被分配给parsed_data

你可以使用strstr()来代替:

const char* comment_start = strstr(input, "<!--"); 
char* result = 0; 
if (comment_start) 
{ 
    result = malloc(comment_start - input + 1); 
    memcpy(result, input, comment_start - input); 
    result[comment_start - input] = 0; 
} 

注意sizeof(char)是保证1因此可以省略为malloc()参数计算的一部分。