strstr совпадение всей строки - PullRequest
2 голосов
/ 19 апреля 2010

Я пытаюсь сопоставить всю строку, а не только ее часть. Например, если needle равно 2, я бы хотел сопоставить только string 2 и not 20, 02, or 22 или что-нибудь связанное.

Я использую strstr как:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
   FILE *file;
   char l[BUFSIZ];
   int linenumber = 1;
   char term[6] = "2";

   file = fopen(argv[1], "r");
   if(file != NULL) {
      while(fgets(l, sizeof(l), file)){
         if(strstr(l, term) != NULL) {
             printf("Search Term Found at %d!\n", linenumber);
         }
         ++linenumber;
      }
   }
   else {
      perror(argv[1]);
   }

   fclose(file);
   return 0;
}

Ответы [ 5 ]

3 голосов
/ 19 апреля 2010

Используйте strcmp вместо strstr или, для лучшего ответа, определите "что-нибудь связанное".

2 голосов
/ 19 апреля 2010

strstr - это , соответствующее строке "2". Если вы не хотите, чтобы он соответствовал вещам, в которых 2 сочетается с другими вещами, вам нужно точно определить, что означает «только строка 2». Это 2 в окружении пробелов?

Я предполагаю, что вы действительно хотите сделать, это токенизировать ввод (возможно, разделенный пробелами или чем-то еще), а затем проверить, является ли токен строкой "2". (В этом случае используйте strtok и strcmp.)

1 голос
/ 19 апреля 2010
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
   FILE *file;
   char l[BUFSIZ];
   int linenumber = 1;
   char term[6] = "2";
   char *p=NULL;    
   file = fopen(argv[1], "r");
   if(file != NULL) {
      while(fgets(l, sizeof(l), file)){
         p=l;       
         while((p=strtok(p, " \r\n\0")) != NULL) { // split token with any delimiter \r or \n or \0 or space
            if(strcmp(p,term) == 0) //then check each word with term
                printf("Search Term Found at %d!\n", linenumber );
            p = NULL; //must be null to fetch next word in the line
         }
         ++linenumber;
      }
   }
   else {
      perror(argv[1]);
   }
   fclose(file);
   return 0;
}
1 голос
/ 19 апреля 2010

Вы должны определить, что такое полная строка. В вашем примере «02», «22» и «20» справедливо совпадают, поскольку «2» в них полностью совпадает. Если вы хотите сопоставлять только «слова», вы должны определить, какие символы являются частью «слов» и какие символы являются разделителями. Часто достаточно пробелов (проверьте с помощью isblank или isspace, так как в качестве вкладок проверяются неразрывные пробелы (\ xA0 в кодировке ANSI)) Иногда у вас могут быть другие символы-разделители ".,; /: + - () !?" так далее. . В этом случае вы должны использовать strtok или если вы не можете (или не хотите) изменять входную строку, вы можете использовать strspn и strcspn. Или даже лучше, в этом случае используйте библиотеку регулярных выражений.

1 голос
/ 19 апреля 2010

Использовать начальные и конечные пробелы


Чтобы найти "2" как уникальное слово, а не как часть других слов:

  • Попробуйте strstr-ing для "2" (обратите внимание на начальные и конечные пробелы).

ПРИМЕЧАНИЕ : в качестве особого случая

  • Поиск первых двух символов для "2" и

  • Найдите в последних двух последних символах "2" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...