2012-12-12 4 views
0

Я использую буфер для приема данных из последовательного порта. Буфер имеет фиксированную длину, которая равна 100, и когда я получаю данные, я сохраняю длину этих данных в переменной (индексе).Проверка подстроки в буфере

Я хотел бы проверить, содержит ли буфер от 0 до индекса-1 подстроку.

Я читал, что могу сделать это с помощью strstr и strdup, но у меня есть две проблемы с этим. Сначала я не знаю, как извлечь строку из буфера, а во-вторых, было бы лучше, если бы мне не пришлось копировать строку, чтобы просто удалить ее на одну строку позже, когда я ищу подстроку в ней.

Мои переменные являются следующие:

char output[100]; 
int index = 0; 
char* substring; 

И я хотел бы функцию, которая возвращает истину, если подстрока на выходе [0: индекс] и ложь в противном случае.

Любая помощь или руководство были бы очень оценены!

Редактировать: Я пишу фрагмент кода для atmel μC, поэтому кажется, что я ограничен those functions.

Edit 2: На самом деле, кажется, что я могу использовать все функции из стандартной string.h

Edit 3: Я проверил точно в моих зависимости и под все функциями я могу позвонить.

extern int ffs (int __val) __ATTR_CONST__; 
extern int ffsl (long __val) __ATTR_CONST__; 
extern int ffsll (long long __val) __ATTR_CONST__; 
extern void *memccpy(void *, const void *, int, size_t); 
extern void *memchr(const void *, int, size_t) __ATTR_PURE__; 
extern int memcmp(const void *, const void *, size_t) __ATTR_PURE__; 
extern void *memcpy(void *, const void *, size_t); 
extern void *memmem(const void *, size_t, const void *, size_t) __ATTR_PURE__; 
extern void *memmove(void *, const void *, size_t); 
extern void *memrchr(const void *, int, size_t) __ATTR_PURE__; 
extern void *memset(void *, int, size_t); 
extern char *strcat(char *, const char *); 
extern char *strchr(const char *, int) __ATTR_PURE__; 
extern char *strchrnul(const char *, int) __ATTR_PURE__; 
extern int strcmp(const char *, const char *) __ATTR_PURE__; 
extern char *strcpy(char *, const char *); 
extern int strcasecmp(const char *, const char *) __ATTR_PURE__; 
extern char *strcasestr(const char *, const char *) __ATTR_PURE__; 
extern size_t strcspn(const char *__s, const char *__reject) __ATTR_PURE__; 
extern char *strdup(const char *s1); 
extern size_t strlcat(char *, const char *, size_t); 
extern size_t strlcpy(char *, const char *, size_t); 
extern size_t strlen(const char *) __ATTR_PURE__; 
extern char *strlwr(char *); 
extern char *strncat(char *, const char *, size_t); 
extern int strncmp(const char *, const char *, size_t) __ATTR_PURE__; 
extern char *strncpy(char *, const char *, size_t); 
extern int strncasecmp(const char *, const char *, size_t) __ATTR_PURE__; 
extern size_t strnlen(const char *, size_t) __ATTR_PURE__; 
extern char *strpbrk(const char *__s, const char *__accept) __ATTR_PURE__; 
extern char *strrchr(const char *, int) __ATTR_PURE__; 
extern char *strrev(char *); 
extern char *strsep(char **, const char *); 
extern size_t strspn(const char *__s, const char *__accept) __ATTR_PURE__; 
extern char *strstr(const char *, const char *) __ATTR_PURE__; 
extern char *strtok(char *, const char *); 
extern char *strtok_r(char *, const char *, char **); 
extern char *strupr(char *); 
+2

«Индексы» - это множественное число «индекс», потому что оно латинское. Единственная форма все еще «указана» :) –

+0

@carlosdc Я отредактировал вопрос, подстрока не имеет длину 1. H2CO3 Извините, что я французский, поэтому иногда я смешиваю между французским и английским в моем коде. – Leo

+0

Звучит для меня как 'strnstr' - это то, что вы хотите. http://www.kernel.org/doc/htmldocs/kernel-api/API-strnstr.html – Michael

ответ

4

От ссылки yo Я отправил, я бы пошел с memmem().

void *memmem(const void *s1, 
      size_t len1, 
      const void *s2, 
      size_t len2); 

memmem() функция находит начало первого вхождения подстроки s2 длины len2 в области памяти s1 длины len1.

+0

Я бы назвал эту функцию, используя непосредственно значение подстроки? Есть что-то вроде 'ptr = memmem (output, 100," blabla ", 6);' correct? – Leo

0

Как говорит Майкл, вы, возможно, следует посмотреть на strnstr.

Отрывок из документации:

#include <string.h> 

char * 
strnstr(const char *s1, const char *s2, size_t n); 

strnstr() функция находит первое вхождение нуль-терминатором строки s2 в строке s1, где не более п символов являются поиска.

так кажется, что вы хотите

char* found = strnstr(output,substring,100); 

В случае, если ваш C Пб ограничен, код довольно прямо вперед:

char* strnstr(char* s, char* find, size_t slen) 
{ 
    char c, sc; 
    size_t len; 

    if ((c = *find++) != '\0') { 
     len = strlen(find); 
     do { 
      do { 
       if ((sc = *s++) == '\0' || slen-- < 1) 
        return (NULL); 
      } while (sc != c); 
      if (len > slen) 
       return (NULL); 
     } while (strncmp(s, find, len) != 0); 
     s--; 
    } 
    return ((char *)s); 
} 
+1

BTW: 'memmem (a, alen, b, blen)' еще более общий, так как ни одна из двух строк не должна быть nul-terminated (и обе строки могут кодировать nuls) – wildplasser

0

данный микроконтроллер Lib Безразлично» t имеют strstr или strnstr ....

char* string_first_of(char* s, char* sub) 
{ 
    int n; 
    if(s == NULL) return NULL; 
    if(sub == NULL) return s; 
    n = strlen(sub); 
    while(*s != 0) 
    { 
     if(strncmp(s, sub, n) == 0) 
     { 
      return s; 
     } 
     s++; 
    } 
    return NULL;  
} 

bool string_contains(char* s, char* sub) 
{ 
    return string_first_of(s, sub) != NULL; 
} 
Смежные вопросы