2017-11-10 32 views
0

第一功能输入文件和子的名字之一是试图文件函数strstr只能检测到文本文件最后一行的子字符串?

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叶子在缓冲尾随换行符,但我用得到的功能为用户输入,所以在这种情况下,这不是原因。

有人能让我知道为什么会发生这种情况吗?

+1

你知道'gets'已被弃用,并且不应该被使用,因为它不会检查缓冲区溢出,对吧?它的手册页声明,它不应该被使用。它只存在于与旧应用程序的向后兼容性。 –

+1

它看起来像是你的问题的原因是你正在阅读和放弃除了最后的文件的所有文件,然后检查字符串的存在。 while循环只读取1024个字符的块并丢弃它们,直到达到结尾。然后它搜索最后读取的块。对'ptr1'的赋值没有任何用处,因为它只是'filearray'的别名(除非第一次读取失败,在这种情况下它是未定义的)。 –

+0

@TomKarzes'gets'在1999年至2011年间已被弃用。自2011年起不再存在 –

回答

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

    }  
} 
+0

感谢您指出概念错误。基本上我是覆盖我的第一条线,第二条和第二条第三条等等?最后,我只剩最后一行覆盖第二行,这是怎么回事? – AMD

+0

@AMD是的。你忘了'while'循环中的大括号,所以只有'ptr1 = filearray'在循环中。 'filearray'然后'ptr1'得到第一行,第二,第三,直到最后。在'while(strstr(filearray,word))'运行时,'while'循环之外,'filearray'和'ptr1'都只包含最后一行。 – Schwern

相关问题