C 来自上一次调用的字符串";“记住”;下一次调用函数后
我在c语言的计算机科学课上遇到了一个问题。我正在调用我创建的一个函数,该函数从一个文件读取数据,将其存储在一个字符数组中,然后将其发送给我创建的另一个函数,这样我就可以从一行打印结果,该行包含一个名为string的特定字符串。除了一件事,一切似乎都起作用了。如果我想打印整个文档,我会用NULL代替字符串。但是,完成此操作后,程序还会打印上次调用函数时的结果,而不使用NULL代替字符串。但我不明白为什么。非常感谢您的帮助。下面是相应的代码C 来自上一次调用的字符串";“记住”;下一次调用函数后,c,string,fread,strtok,strstr,C,String,Fread,Strtok,Strstr,我在c语言的计算机科学课上遇到了一个问题。我正在调用我创建的一个函数,该函数从一个文件读取数据,将其存储在一个字符数组中,然后将其发送给我创建的另一个函数,这样我就可以从一行打印结果,该行包含一个名为string的特定字符串。除了一件事,一切似乎都起作用了。如果我想打印整个文档,我会用NULL代替字符串。但是,完成此操作后,程序还会打印上次调用函数时的结果,而不使用NULL代替字符串。但我不明白为什么。非常感谢您的帮助。下面是相应的代码 /*getText.c*/ #include<std
/*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调用它时,它会正常工作。IngetFileText()
您将文件读入缓冲区,但无法知道文件的结尾在哪里。然后在parseText
中执行strcpy(buff,text)代码>。可能发生的情况是,这是复制所有文件,然后只是在读取文件结束后复制脏内存,其中仍然包含以前文件读取的内容
strcpy
函数一直读取,直到找到一个空字节,但在读取文件的末尾没有任何空字节。要解决此问题,您必须检查fread
的返回值,以了解实际读取了多少字节,然后在程序中包含一个方法,让其他函数知道它们应该使用的数据结尾在哪里。使用所有警告和调试信息编译(gcc-Wall-g
)。学习使用调试器(gdb
)以及什么是正常运行时间、时间\u关键字;时间和内核?。。。什么是MAX_文件?