0

我有以下代码可以从文件中读取:

fin = fopen("file1.txt", "r");

char* url;
if ( fin ) 
{
    while ( line = read_line(fin) ) 
    {
        if ( (url=strstr(line, "url="))!=NULL )
        {
            fprintf(stdout, "%s \n", url);
            url=line;
        }
        free(line);
    }
}

printf("line is:%s ",url); //this one is NULL. How to solve this? 
                           // I need A COPY OF THE DATA
fclose(fin);

出于某种原因urlnull何时printf被调用 - 我该如何解决?我需要一份数据副本。

4

2 回答 2

2

url 只是一个指向内存块的指针,它不包含字符串。当您调用 free(line) 时,您会删除指向的内存 url。

您需要为 url 分配内存,然后使用 strcpy 复制字符串。

还要确保 if 中的代码实际运行,否则 url 指向内存中的随机点。

沿着这些思路。我不确定 strcpy 的参数顺序,在尝试之前先查一下。

char* url = 0;
if ( fin ) 
{
    while ( line = read_line(fin) ) 
    {
        char* tmp_url = strstr(line, "url="));
        if (tmp_url != NULL)
        {
            if(url != 0) free(url);
            url = (char*)malloc(sizeof(char)*strlen(line)+1); //if you don't know why I'm adding +1 look up null terminated strings
            fprintf(stdout, "%s \n", url);
            strcpy(url, line);
        }
        free(line);
    }
}
于 2012-09-12T15:30:32.740 回答
0

read_line如果您的函数没有分配内存,那会容易得多。这是一个建议的更改(未经测试:xmalloc 和 xfopen 显然是失败时退出的包装器):

char *path = "file1.txt";
char* url;
size_t line_size;
line = xmalloc( line_size = 128 );
fin = xfopen( path, "r");
/* Pass &line so that read_line may realloc if necessary */
while( read_line2( fin, &line, &line_size )) {
        if( url = strstr( line, "url=" )) {
            printf( "%s \n", url);
            url=line;
        }
    }
}
printf("line is:%s ",url); 
free(line);
fclose(fin);
于 2012-09-12T15:44:37.337 回答