C 来自上一次调用的字符串";“记住”;下一次调用函数后

C 来自上一次调用的字符串";“记住”;下一次调用函数后,c,string,fread,strtok,strstr,C,String,Fread,Strtok,Strstr,我在c语言的计算机科学课上遇到了一个问题。我正在调用我创建的一个函数,该函数从一个文件读取数据,将其存储在一个字符数组中,然后将其发送给我创建的另一个函数,这样我就可以从一行打印结果,该行包含一个名为string的特定字符串。除了一件事,一切似乎都起作用了。如果我想打印整个文档,我会用NULL代替字符串。但是,完成此操作后,程序还会打印上次调用函数时的结果,而不使用NULL代替字符串。但我不明白为什么。非常感谢您的帮助。下面是相应的代码 /*getText.c*/ #include<std

我在c语言的计算机科学课上遇到了一个问题。我正在调用我创建的一个函数,该函数从一个文件读取数据,将其存储在一个字符数组中,然后将其发送给我创建的另一个函数,这样我就可以从一行打印结果,该行包含一个名为string的特定字符串。除了一件事,一切似乎都起作用了。如果我想打印整个文档,我会用NULL代替字符串。但是,完成此操作后,程序还会打印上次调用函数时的结果,而不使用NULL代替字符串。但我不明白为什么。非常感谢您的帮助。下面是相应的代码

/*getText.c*/
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>    
#include"getText1.h"

void getFileText(char *fileName, char *keyWord)
{
        FILE *file = fopen(fileName, "r");
        char *answer = (char*)malloc(sizeof(char)*MAX_FILE);
        if(file != NULL)
         {
                fread(answer, sizeof(char), MAX_FILE, file);
                parseText(keyWord, answer);
        }
        else
        {
                perror("Error in getText.c, fopen:");
                exit(-1);
        }
        fclose(file);
        free(answer);
 }

void parseText(char *string, char *text)
{
    char buff[MAX_FILE];
    char * ptr;
    int a = 0;
       strcpy(buff, text);
       ptr = strtok(buff, "\n");
        if(string != NULL)
        {
               while(ptr != NULL && a == 0)
               {
                       if(strstr(ptr, string) != NULL)
                       {
                               printf("test1 ");
                               printf("%s\n", ptr);
                               printf(" test2\n");
                               a = 1;
                       } 
                        ptr = strtok(NULL, "\n");
               }
       }
       else
       {
               printf(text);
       }   
  }

/*main*/
#include<stdio.h>
#include<string.h>

#include"getText1.h"
#include"fileName.h"

int main ()
{
        getFileText("/proc/diskstats", "sda");
        printf("Uptime ");
        getFileText(UPTIME, NULL);
        getFileText(TIME, TIME_KEYWORD);
        printf("Kernel Version ");
        getFileText(KERNEL, NULL);
        return 0;    
}
/*getText.c*/
#包括
#包括
#包括
#包括
#包括“getText1.h”
void getFileText(char*文件名,char*关键字)
{
FILE*FILE=fopen(文件名,“r”);
char*answer=(char*)malloc(sizeof(char)*MAX_文件);
如果(文件!=NULL)
{
fread(应答,sizeof(char),MAX_文件,FILE);
解析文本(关键字、答案);
}
其他的
{
perror(“getText.c中的错误,fopen:”);
出口(-1);
}
fclose(文件);
免费(回答);
}
无效解析文本(字符*字符串,字符*文本)
{
字符buff[最大值文件];
char*ptr;
int a=0;
strcpy(浅黄色,文本);
ptr=strtok(buff,“\n”);
if(字符串!=NULL)
{
while(ptr!=NULL&&a==0)
{
if(strstr(ptr,string)!=NULL)
{
printf(“test1”);
printf(“%s\n”,ptr);
printf(“test2\n”);
a=1;
} 
ptr=strtok(空,“\n”);
}
}
其他的
{
printf(文本);
}   
}
/*主要*/
#包括
#包括
#包括“getText1.h”
#包括“fileName.h”
int main()
{
getFileText(“/proc/diskstats”,“sda”);
printf(“正常运行时间”);
getFileText(正常运行时间,空);
getFileText(时间,时间\关键字);
printf(“内核版本”);
getFileText(内核,NULL);
返回0;
}
我遇到的问题是,对getFileText()的第一个调用工作正常,并打印出相应的行。但是,当我在字符串为NULL的情况下再次调用它时,它会打印整个/proc/UPTIME(或UPTIME),然后打印整个/proc/diskstats,当我为内核调用它时,它也会做同样的事情,但当我为TIME调用它时,它会正常工作。

In
getFileText()
您将文件读入缓冲区,但无法知道文件的结尾在哪里。然后在
parseText
中执行
strcpy(buff,text)。可能发生的情况是,这是复制所有文件,然后只是在读取文件结束后复制脏内存,其中仍然包含以前文件读取的内容


strcpy
函数一直读取,直到找到一个空字节,但在读取文件的末尾没有任何空字节。要解决此问题,您必须检查
fread
的返回值,以了解实际读取了多少字节,然后在程序中包含一个方法,让其他函数知道它们应该使用的数据结尾在哪里。

使用所有警告和调试信息编译(
gcc-Wall-g
)。学习使用调试器(
gdb
)以及什么是正常运行时间、时间\u关键字;时间和内核?。。。什么是MAX_文件?