2015-10-25 6 views
1

Это может быть основной материал, но я не смог найти компактное решение. Я ищу строку внутри большей строки. С его аппаратной иногда я теряю входные данные, и поэтому я хотел бы проверить, если один из нескольких слов существуют в большом тексте, так:strstr для поиска ИЛИ?

strstr(wifiContent,"SEND OK HTTP: Connection:) 

будет искать внутри wifiContent если эти слова появляются в это сочетание, но я хотел бы, чтобы он вернулся> 0, даже если только один из них появляются в строке,

Так что для этого входа:

SEND OK BLA BLA BLA.. BLA BLA BLA.. HTTP: ...BLA BLA BLA... Connection...bla 

Хотелось бы узнать правду (или индекс> 0) для результатов поиска.

Как я могу достичь этого с помощью strstr?

EDIT:

Я безуспешно пытался это один:

char * pch; 
      char *scopy; 
      strcpy(scopy,wifiContent); 
      pch = strtok (scopy," ,.-"); 
      while (pch != NULL) 
      { 
      if(strstr(wifiContent,pch)) 
       return 1; 

       pch = strtok (NULL, " ,.-"); 
      } 

      if(strstr(wifiContent,target)) 
       return 1; 
+2

Да, в нескольких вызовах 'strstr' вы можете сделать это, потому что строки в другую позицию в исходной строке. – ameyCU

+0

вы также можете использовать 'fnmatch' и создать шаблон по своему усмотрению. например, «ОТПРАВИТЬ ОК» HTTP: * СОЕДИНЕНИЕ: * « –

+0

Я не понимаю .. у меня нет нескольких вызовов, я получаю текстовую строку для поиска, и этот текст построен из нескольких слов, как я показываю -« ОТПРАВИТЬ ОК ... ". поэтому я должен взять эту строку поиска так, как есть, и проверить, появляется ли одно из ее слов в более крупном тексте. – Curnelious

ответ

1

меня удается сделать это с помощью великих людей в комментариях:

    char * pch; 
        pch = strtok (target," "); 
        while (pch != NULL) 
        { 
        if(strstr(wifiContent,pch)) 
         return 1; 

         pch = strtok (NULL, " "); 
        } 

        if(strstr(wifiContent,target)) 
         return 1; 
+0

хорошо, что этот не всегда работает, поэтому я буду рад получить некоторые комментарии о его потоках. – Curnelious

+0

Выглядит хорошо для меня. Добавьте 'return 0' в конец, если это отдельная функция. Можете ли вы сказать, на какой вклад он не работает? – usr2564301

2

Вот простая программа, демонстрирующая, как это сделать -

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main (void) 
{ 
    char a[]="SEND OK BLA BLA BLA.. BLA BLA BLA.. HTTP: ...BLA BLA BLA... Connection...bla"; 
    char s[]="SEND OK HTTP: Connection"; //string with words you want to check 
    char *ret ,*token; 
    int index=0;       // declare index 
    token=strtok(s," ");     // tokenize s 
    while(token!=NULL){     // check return of strtok 
     ret=strstr(a,token);    // search words 
     if(ret!=NULL)      // check return of strstr 
      index++;      // increment index 
     token=strtok(NULL," ");    
    } 
    printf("%d",index);     // print index 
    return 0; 
} 

Это будет в основном поиск этих четырех слов в исходной строке и приращении index, если обнаружено какое-либо из них. Таким образом, исходная строка остается неизменной.

Output of above program

+0

@ M.M Вы правы, у меня создалось впечатление, что он будет изменен (подумал, что он передан 'strtok'-Foolish из меня (я запутался в' '' и 'a')). В этом нет необходимости. Благодаря !! – ameyCU

1

Вы могли бы написать:

return strstr(wifiContent, "SEND") 
    || strstr(wifiContent, "OK") 
    || strstr(wifiContent, "HTTP:") 
    || strstr(wifiContent, "Connection"); 
Смежные вопросы