下次调用函数后,“记住”上一次调用的字符串

时间:2014-03-09 18:47:03

标签: c string fread strtok strstr

我在c的计算机科学课程中遇到了麻烦。我正在调用一个我创建的函数,它从一个文件读取,将它存储在一个char数组中,然后将其发送到我创建的另一个函数,以便我可以从包含一个名为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;    
}

我得到的问题是第一次调用getFileText()工作正常,并打印出相应的行。但是,当我再次为UPTIME调用字符串为NULL时,它打印出整个/ proc / uptime(或UPTIME),然后打印整个/ proc / diskstats并在我为KERNEL调用它时执行相同的操作,但是当我把它称为TIME时,它会起作用。

1 个答案:

答案 0 :(得分:0)

getFileText()中,您从文件中读取了malloc'的缓冲区,但您无法知道文件末尾的位置。然后在parseText strcpy(buff, text);进行strcpy。可能发生的是,这是复制所有文件,然后只是在读取文件结束后复制脏内存,该文件仍包含先前文件读取的内容。

fread函数读取,直到找到空字节,但在读取文件的末尾没有任何空字节。要解决此问题,您必须检查{{1}}的返回值以找出实际读取的字节数,然后在程序中包含一个方法,以便其他函数知道数据的结尾在哪里应该与之合作。