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», мне бы хотелось знать, как вводить набор символов (если это возможно).


person Bas Jansen    schedule 25.02.2013    source источник


Ответы (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;
}
person md5    schedule 25.02.2013
comment
Что вы думаете о влиянии на производительность выполнения второй strstr и memcpy по сравнению с использованием одной strstr с sscanf (если это вообще возможно)? - person Bas Jansen; 25.02.2013
comment
В зависимости от длины вашей строки, она должна быть незначительной. sscanf — это форматированная функция, а memcpy — встроенная функция многих компиляторов, возможно, оптимизированная с помощью векторных операций, которые очень быстро выполняются на современных процессорах. Используйте профилировщик, если вам действительно важны такие детали, хотя я совершенно уверен, что в вашем приложении есть более серьезные узкие места. ;-) - person md5; 25.02.2013