2013-02-25 61 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