C 函数strstr仅检测文本文件最后一行中的子字符串?

C 函数strstr仅检测文本文件最后一行中的子字符串?,c,C,第一个函数输入文件名和试图在文件中查找的子字符串 void userinput(char filename[],char word[]) { printf("Enter the name of the file\n"); gets(filename); printf("Enter the word\n"); gets(word); } 第二个函数读取文件并打印子字符串的地址(如果能够找到) void findandreplace(char filename[], ch

第一个函数输入文件名和试图在文件中查找的子字符串

void userinput(char filename[],char word[])
{  
  printf("Enter the name of the file\n");
  gets(filename);

  printf("Enter the word\n");
  gets(word);

}
第二个函数读取文件并打印子字符串的地址(如果能够找到)

 void findandreplace(char filename[], char word[])
 {                                    
   FILE *infile;

  char *ptr1,*ptr2,filearray[1024];
  infile=fopen(filename,"r");

  if(infile==NULL)
  {
    perror("Could not open file");
    exit(EXIT_FAILURE);
  }                                        

 while(fgets(filearray,sizeof(filearray),infile)!=NULL)

 ptr1=filearray;

 if(strstr(filearray,word))
  {
    ptr2=strstr(ptr1,word);
    printf("%p",ptr2);
  } 

 else
  {
    printf("Entered word not found in file");

  }      

}
函数strstr只能检测文件最后一行中的子字符串,我知道fgets会在缓冲区中留下一个尾随的新行字符,但我使用get函数作为用户输入,所以在这种情况下这不是原因

有人能告诉我为什么会这样吗?

问题是:

while(fgets(filearray,sizeof(filearray),infile)!=NULL)

 ptr1=filearray;
您的
while
循环没有关联的块。应该是这样的

while( condition ) {
    code to do for each iteration
}
在C中,如果循环或if语句没有块,它将使用下一个语句。所以你上面写的就是这个

while(fgets(filearray,sizeof(filearray),infile)!=NULL) {
   ptr1=filearray;
}
您正在迭代文件中的每一行,并将它们分配给
ptr1
。在文件循环的末尾,只有
ptr1
中的最后一行。然后剩下的代码只在最后一行上运行

相反,你想要这个

while(fgets(filearray,sizeof(filearray),infile)!=NULL) {
    ptr1=filearray;

    if(strstr(filearray,word))
    {
        ptr2=strstr(ptr1,word);
        printf("%p",ptr2);
    } 

    else
    {
        printf("Entered word not found in file");

    }      
}

为了避免将来出现此类问题,请确保使用自动缩进代码的编辑器。例如,这是一个很好的选择。压痕将立即显示问题。下面是让Atom自动缩进后的代码

while(fgets(filearray,sizeof(filearray),infile)!=NULL)

ptr1=filearray;

if(strstr(filearray,word))
{
    ptr2=strstr(ptr1,word);
    printf("%p",ptr2);
} 

else
{
    printf("Entered word not found in file");

}
注意以下语句的缩进方式与
while
语句相同。这表明它们不是
while
循环的一部分

while(fgets(filearray,sizeof(filearray),infile)!=NULL) {
    ptr1=filearray;

    if(strstr(filearray,word))
    {
        ptr2=strstr(ptr1,word);
        printf("%p",ptr2);
    } 

    else
    {
        printf("Entered word not found in file");

    }      
}
相反,当我放入块并自动缩进时,您可以清楚地看到哪些语句在
while
循环中

while(fgets(filearray,sizeof(filearray),infile)!=NULL) {
    ptr1=filearray;

    if(strstr(filearray,word))
    {
        ptr2=strstr(ptr1,word);
        printf("%p",ptr2);
    } 

    else
    {
        printf("Entered word not found in file");

    }      
}

您知道,
gets
是不推荐使用的,并且永远不应该使用它,因为它不检查缓冲区溢出,对吗?它的手册页声明永远不要使用它。它的存在只是为了与非常旧的应用程序向后兼容。您出现问题的原因似乎是您正在读取并丢弃除最末端以外的所有文件,然后检查字符串是否存在。while循环只读取1024个字符的块并丢弃它们,直到到达末尾。然后搜索最后读取的块。对
ptr1
的赋值没有任何意义,因为它只是
filearray
的别名(除非第一次读取失败,在这种情况下它是未定义的)。@tomkarze
get
在1999年到2011年之间被弃用。自2011年以来,它不再存在指出概念错误的感谢。基本上我覆盖了我的第一行,第二行,第二行,第三行,依此类推?最后,我只剩下最后一行,它覆盖了最后一行的第二行,这就是右边发生的事情吗?@AMD是的。当循环时,您忘记了
周围的大括号,因此只有
ptr1=filearray
在循环中
filearray
然后
ptr1
获取第一行、第二行、第三行直到最后一行。当
if(strstrstr(filearray,word))
运行时,在
while
循环之外,
filearray
ptr1
都只包含最后一行。