2010-12-05 14 views
0

ソケットから読み込み、printf(必須)を使用してstdoutに出力しようとしています。char *のprintfがセグメンテーションフォールトを取得する

しかし、私は正常なWebサイトから特定のファイル(HTML)を読むたびにSegmentation Faultを取得します。

このコードを見て、間違っていることを教えてください。

int total_read = 0; 
char* read_buff = malloc(BUF_SIZE); 
char* response_data = NULL; 
if (read_buff == NULL){ 
    perror("malloc"); 
    exit(1); 
} 
while((nbytes = read(fd, read_buff, BUF_SIZE)) > 0){ 
    int former_total = total_read; 
    total_read += nbytes; 
    response_data = realloc(response_data, total_read); 
    memmove(response_data + former_total, read_buff, nbytes); //start writing at the end of spot before the increase. 
} 
if (nbytes < 0){ 
    perror("read"); 
    exit(1); 
} 

printf(response_data); 

ありがとうございます。

+1

あなたの問題を解決するための答えでチェックマーク形のアイコンをクリックする必要があります。 – erjiang

+1

response_dataにはどのようなものがありますか? printf形式の文字が含まれていると、printfは渡されなかったパラメータにアクセスしようとします。試してみてください。 –

答えて

9

response_dataはおそらくNUL('\0')が終了していないため、printfは文字列の最後を過ぎて続きます。あるいは、おそらく%という指令が含まれていますが、printfはそれ以上の引数を見つけることができません。

代わりに、printfの読み取り距離を指定し、ではなく、文字列の%ディレクティブを解釈します。

printf("%.*s", total_read, response_data); 

response_dataが埋め込まれたNULが含まれている場合total_readが長い場合でも、printfが停止することに注意してください。

+1

1つの修正は次のとおりです。printf( "%。* s"、total_read、response_data); (アスタリスクの前にはありません)。 –

+0

@Luis: 'response_data'に埋め込まれたNULがあり、'%* s 'はスペースで埋め、 '% - * s'は反対側にスペースを入れます。'%。* s'はすべて。 OPが何を望んでいるかによる... – ephemient

+0

しかし、文字列フォーマットの精度は、印刷される最大文字数ではありませんか? –

1

response_dataには何がありそうですか? printf形式の文字(通常、%の後に1つのオプションが続きます)が含まれていると、printfは渡されなかったパラメータにアクセスしようとします。代わりにputsをお試しください。

あなたは、printfのを使うprintf("%s", response_data)を行う(最初にそれをNUL-終了)しなければならない場合

+0

ありがとう、 これは動作します。私はまだどのフォームを使うか検討しています。 – SnapDragon

-2

あなたのポストからの私の理解では、応答がHTMLデータであるということです。
テキストであるため、印刷しようとしています。あなたのやり方でprintfを使用しないでください。
は、代わりに次の手順を実行します。

for(int i = 0; i < total_read; i++) 
    putc(response_data[i],stdout); 
+0

これはおそらく私が今まで見た 'putc'の中で最も遅いものです... –

+0

Putcはまだこれを行う方法ではありません。あなたはprintf "%.s"が何をするのかを再実装しています。 –

関連する問題