Printf - 取消垃圾

时间:2015-07-17 15:00:18

标签: c

我正在实现一个环形缓冲区。但是当我使用printf时,很多垃圾出现在我想要的之后:

    char *dados1 = "XXXX";
    char *dados2 = "YYYY";
    char target_1[4];
    char target_2[1];
    RingBuffer *Buffer_em_Anel = RingBuffer_create(10);

    RingBuffer_write(Buffer_em_Anel, dados1, 4);
    RingBuffer_read(Buffer_em_Anel, target_1, 4);
    printf("actual buffer %s \n", Buffer_em_Anel->buffer);
    printf("Characters from read%s \n", target_1);//<---XXXX+lots_of_junk

在调试信息中,一切看起来都很好。

enter image description here

2 个答案:

答案 0 :(得分:4)

您要打印的缓冲区只包含4个X字符。

当您使用%s说明符时,printf将继续打印所有字符,直到遇到NUL终结符(\0)。

您不知道\0将在内存中出现的位置,因此printf将继续打印,可能远远超出您的4个字节,直到它随机遇到\0

要打印4个字符,我会尝试:

printf("actual buffer %.4s \n", Buffer_em_Anel->buffer);  // Note the 4 for width-specifier.
printf("Characters from read%.4s \n", target_1);

答案 1 :(得分:1)

C字符串是 null终止 char数组。假设您的RingBuffer_write函数是类似memcpy的函数,则不要复制将发出字符串结尾信号的'\0'。所以之后的垃圾,实际上直到内存中的下一个null。