2013-02-25 63 views
3

我有一个字符串方含空格和标签,如:sscanf的和定制休息

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

我想只捕捉描述标签后和之前的部分“OS =”,想知道它是否情理之中的事带有自定义符号的sscanf(请参阅我目前正在进行的页面底部的工作),或者如果最好使用第二个strstr来解析操作系统。

在此先感谢

- 其他信息 -

if ((p_str = (char*) strstr(buffer,"\"description\">"))) { 
    sscanf(p_str+14,"%[^OS]",(file+teller)->description); 
} 

PS:%[^ OS]处断裂的 'O',我会爱第一次出现的字符串,知道如何输入一组字符(如果可能的话)。

回答

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; 
} 
+0

你有什么执行第二的strstr和比较于使用单的strstr用sscanf的(如果是连的memcpy的性能影响的想法可能)? – 2013-02-25 17:23:05

+0

根据你的字符串的长度,它应该是可以忽略的。 'sscanf'是一个格式化的函数,而'memcpy'是许多编译器的内置函数,可能在现代处理器上使用矢量操作进行了优化。如果你真的关心这样的细节,那么使用一个分析器,但我相信你的应用程序有更大的瓶颈。 ;-) – md5 2013-02-25 17:34:05