避免缓冲区下溢和溢出

时间:2013-12-28 14:20:16

标签: c

我的缓冲区大小是50,但我想加载我的缓冲区只有12个长度字符
  并且我必须加载具有不同字符长度的缓冲区,但我不能   再次加载缓冲区,它显示以前的数据与一些垃圾值。我试图   通过使用硬编码值删除垃圾值,并再次重新初始化缓冲区为零值,但我仍然遇到同样的问题。

此代码用于接收C

中的数据
{
    if(PortRecvs(0,buff,sizeof(buff),1000)<0)               
    { 
        clrscr();
        printf("Receive Fail..");
        DelayMs(1000);
    }

    clrscr();
    printf("Receive Buff:\n%s",buff);
    DelayMs(1000);
    if(PortRecvs(0,buff,12,1000)<0)              
    { 
        clrscr();
        printf("Receive Fail..");
        DelayMs(1000);
    }
    clrscr();
    printf("Receive Buff:\n%s",buff);
    DelayMs(1000);

}

1 个答案:

答案 0 :(得分:1)

有太多的clrscr()调用来进行良好的调试。 DelayMs()电话也会让我感到疯狂(虽然有些人会认为这对我来说是一种不必要的锻炼)。

您的PortRecvs()函数返回读取的字节数是合理的推理;但是,您不能确保printf()仅打印读取的字节数。您的代码可能看起来更像:

{
    int nbytes;
    if ((nbytes = PortRecvs(0, buff, sizeof(buff), 1000)) < 0)               
    { 
        printf("Receive Fail.\n");
        DelayMs(1000);
    }
    else
        printf("Receive Buff: [[%.*s]]\n", nbytes, buff);  // Do not print if receive failed
    DelayMs(1000);
    if ((nbytes = PortRecvs(0, buff, 12, 1000)) < 0)              
    { 
        printf("Receive Fail.\n");
        DelayMs(1000);
    }
    else
        printf("Receive Buff: [[%.*s]]\n", nbytes, buff);
    DelayMs(1000);
}

请注意,如果接收失败,此代码不会打印缓冲区。它确保每条消息以换行符结尾。它使用标记[[]]包围数据(如果您不喜欢,请选择自己的数据 - 我经常使用<<>>)以便您可以看到更容易拖尾空白或嵌入换行符。最重要的是,它使用%.*s转换规范来打印从PortRecvs()收到的字节数。

请注意,像PortRecvs()这样的函数通常使用二进制数据,并且不会为接收的值添加空终止符。您有责任确保在没有正确终止的情况下处理数据。