指针char函数第二次没有运行

时间:2013-11-18 13:54:23

标签: c

我写过这个函数,它读取一个文件,比较一个字符串到每一行,如果该行包含该字符串,则返回它。

    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" 

我想知道我到底做错了什么。

2 个答案:

答案 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)。