Sscanf和自定义断点

3

I have a string containg spaces and tags like:

<note label="description">sp|P02671|FIBA_HUMAN Fibrinogen alpha chain OS=Homo sapiens GN=FGA PE=1 SV=2</note>

我希望能够捕获“description”标签后和“OS=”前的内容。我在想是否可以使用sscanf和自定义符号来完成(请参见我当前的工作进展底部),或者使用第二个strstr函数解析OS会更好一些。谢谢。--更多信息--
if ( (p_str = (char*) strstr(buffer,"\"description\">")) ) {
  sscanf(p_str+14,"%[^OS]",(file+teller)->description);
}

PS: %[^OS]会在第一个'O'出现的位置处截断字符串,我很想知道如何输入一组字符(如果可能的话)。

1个回答

1

我宁愿使用两次strstr函数,如下所示:

#include <assert.h>
#include <stdlib.h>
#include <string.h>

char *f (const char *s) {
#define START_SYM   "\"description\""
#define END_SYM     "OS="

    char *dst   = NULL;
    char *start = strstr(s, START_SYM);
    char *end   = strstr(s, END_SYM);

    if (start != NULL && end != NULL) {
        ptrdiff_t diff = end - start;

        assert(diff > 0);
        dst = malloc(diff + 1);

        if (dst != NULL) {
            memcpy(dst, start + sizeof START_SYM, diff);
            dst[diff] = '\0';
        }
    }

    return dst;
}

你对执行第二个strstr和memcpy相比于使用单个strstr与sscanf(如果可能的话)的性能影响有什么想法? - Bas Jansen
根据您的字符串长度,它应该是可以忽略不计的。sscanf是一个格式化函数,而memcpy是许多编译器内置的函数,可能使用向量操作进行优化,在现代处理器上非常快速。如果您真的关心这些细节,请使用分析工具,尽管我相信在您的应用程序中有更大的瓶颈。;-) - md5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接