我写过这个函数,它读取一个文件,比较一个字符串到每一行,如果该行包含该字符串,则返回它。
char* FileSearch2 (char* File_Name , char* String) {
FILE * T = fopen(File_Name, "rt");
char* Line = (char*) malloc (sizeof(char*) * 1024);
strcat(String,"\t");
if (T) {
while (fgets(Line,1024,T)) {
if (strstr(Line, String) != NULL) {
fclose(T);
return Line;
}
}
}
fclose(T);
return "0";
}
问题是,第二次运行此函数时,它总是返回“0”。
例如
char* FirstRun = FileSearch2 ("File.txt", Value); // Assuming the value is "Hello", it returns the line
现在
char* SecondtRun = FileSearch2 ("File.txt", Value); // Assuming the value is "Hello", it returns "0"
我想知道我到底做错了什么。
答案 0 :(得分:3)
您的代码有一些严重错误。
例如,您的malloc()
逻辑完全错误。
您似乎想要为1024个字符的行分配空间,但是您这样做:
char* Line = (char*) malloc (sizeof(char*) * 128);
它应该只是:
char *Line = malloc(1024);
Don't cast the return value of malloc()
in C,与sizeof(char *)
的业务完全错误并且混淆不清。
如果未找到该行,则您无法free()
该行,这是另一个问题。
您的代码也会通过调用strcat()
来更改来电者的数据,这意味着如果您使用例如一个字符串文字(如你的例子所暗示的)它完全未定义的行为会发生什么。您应该重新考虑'\t'
的那个部分 - 附加,这不是最好的方法。
答案 1 :(得分:2)
好吧,我希望这是因为你的函数FileSearch通过在其中添加制表符来修改String
。所以第二次,你正在寻找一个最后有两个标签的字符串。
您应该复制String
,将标签附加到副本,然后在最后释放副本。
char *copy = strdup(String);
strcat(copy,"\t");
if (T) {
while (fgets(Line,1024,T)) {
if (strstr(Line, copy) != NULL) {
fclose(T);
free(copy);
return Line;
而且,正如@unwind所说,如果找不到字符串,你需要释放Line
(和copy
)。