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 に答える