第一个函数输入文件的名称和一个试图在文件中找到的子字符串
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函数作为用户输入,所以在这里这不是原因。
有人可以告诉我为什么会这样吗?
答案 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");
}
}