-3

重複の可能性:
多次元配列とバッファの転送

バッファーを 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

1 に答える 1

0

DRY (Don't Repeat Yourself) の原則に従うようにしてください。

key_num = 0;
cbuf_pos = 0;
for (buf_pos = 0; buf_pos < msg_size+1; buf_pos++)
{
    if (buf_pos % 1800 == 0 && buf_pos > 0)
    {
        msg_buff[key_num][cbuf_pos] = '\0';
        key_num++;
        cbuf_pos = 0;
    }
    msg_buff[key_num][cbuf_pos] = buf[buf_pos];
    printf("%c", msg_buff[key_num][cbuf_pos]);
    cbuf_pos++;
}

変更されたコードでは、最初の文字のインクリメントが回避されていることに注意してください (ただし、が 0 のbuf_pos > 0場合のみをテストbuf_pos % 1800し、1800 回のうち明らかな 1799 回のテストを回避しています。

診断出力がなければ、次の 2 ~ 3 行ではなく 1 行を書きますif

    msg_buff[key_num][cbuf_pos++] = buf[buf_pos];

以下を使用して、診断プリントも改善できます。

printf("m[%d][%d] = %c\n", key_num, cbuf_pos, msg_buf[key_num][cbuf_pos]);

これにより、問題が強調される可能性があります (ただし、すぐに冗長になりすぎることは認めます)。

key_num == 1ループの最初のパスでスキップするという事実が問題でない限り、これは実際には問題を説明していません。

于 2012-04-08T06:11:36.333 に答える