-2

バッファーを 1800 文字の配列セグメントに保存しようとしています。いつでもバッファを転送できますが、新しいバッファをそれぞれ出力しようとすると。出力に null を取得します。私は正確に何を間違っていますか?


編集 - ループをこれに変更して、2 番目の次元の最後に null 終端を追加しました。今、出力はそれがnullであることを教えてくれます。しかしprintf("%c")、データは転送されたと言っています。

while(buf_pos < msg_size+1){
    if(buf_pos % 1800 == 0){
        msg_buff[key_num][cbuf_pos]='\0';
        key_num++;
        cbuf_pos=0;
        msg_buff[key_num][cbuf_pos]=buf[buf_pos];
    }else
        msg_buff[key_num][cbuf_pos]=buf[buf_pos];

    printf("%c",msg_buff[key_num][cbuf_pos]);
    cbuf_pos++;
    buf_pos++;
}
4

2 に答える 2

1

cbuf_posに割り当てるときに、どこをインクリメントしていmsg_buffますか?また、 では、を '\0'if(buf_pos % 1800 ==0)で終了しますmsg_buff[key_num][cbuf_pos](あと 1 文字残っていることを確認します)。

于 2012-04-08T04:55:18.330 に答える
0

これが何をすることを期待していますか?

                printf("KEY%d DATA:%.*s\n",count,msg_buff[count][0],1800);

msg_buff[count][0]配列の最初の文字です。msg_buff[count]文字列全体を出力するには、渡す必要があります。

また、 * 修飾子はThe width is not specified in the format string として定義されていますが、フォーマットする必要がある引数の前に追加の整数値引数として定義されています。1800これは、3 番目の引数 ( )が 2 番目の引数 ( ) の前になければならないことを意味すると解釈しますmsg_buff[count]。簡単にするために、すべての文字列が NULL で終了していることを確認し、幅修飾子を使用しないでください。

キーの配列を実際に作成するには、ループ内で各文字を 1 つずつコピーしないでください。strncpy代わりに使用してください。バッファに NULL ターミネータ用のスペースがあることを確認します (1800 ではなく 1801 バイトを割り当てます)。をインクリメントcbuf_posしないため、現在、コピーループはとにかく壊れています。そのため、すべての文字が配列の最初の位置に書き込まれます。

于 2012-04-08T04:51:32.147 に答える