strstr整个字符串匹配

时间:2010-04-19 03:51:15

标签: c string

我正在尝试匹配整个字符串而不仅仅是它的一部分。例如,如果needle2,我想仅匹配string 2not 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 个答案:

答案 0 :(得分:3)

使用strcmp代替strstr,或者为了更好的答案,定义“任何相关的内容”。

答案 1 :(得分:2)

strstr 匹配字符串"2"。如果您不希望它与2与其他内容相结合的内容匹配,那么您必须准确定义“只是字符串2”的含义。是2被空白包围了吗?

我猜你真正想要做的是标记输入(可能在空格或其他东西上分隔),然后检查一个标记是否为字符串"2"。 (在这种情况下,请使用strtokstrcmp。)

答案 2 :(得分:1)

使用前导和尾随空格


要找到“2”作为唯一单词而不是其他单词的一部分:

  
      
  • 尝试strstring为“2”(注意前导和尾随空格字符)。
  •   

注意:作为特例,

  • 在前两个字符中搜索“2”

  • 在文件中搜索最后两个字符“2”

答案 3 :(得分:1)

您必须定义完整的字符串。在您的示例中,“02”“22”和“20”正确匹配,因为“2”完全匹配。如果你只想匹配“单词”,你必须定义“单词”的字符部分是什么,以及哪些字符是分隔符。通常用空格就足够了(用isblankisspace作为制表符检查非破坏空格(ANSI编码中的\ xA0)。有时您可能有其他分隔符“。,; /:+ - ()!?”等。在这种情况下,您必须使用strtok,或者如果您不能(或不希望)修改输入字符串,则可以使用strspnstrcspn。或者甚至更好,在这种情况下,使用正则表达式库。

答案 4 :(得分:1)

#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;
}