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

时间:2017-11-10 21:06:50

标签: 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[], 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在缓冲区中留下了一个尾随的新行字符,但是我使用gets函数作为用户输入,所以在这里这不是原因。

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

1 个答案:

答案 0 :(得分:2)

问题在于:

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是一个不错的选择。缩进将立即显示问题。这是在让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循环中的哪些语句。

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");

    }      
}