如何计算我的缓冲区使用量(大小)为write()?

时间:2015-03-30 05:10:03

标签: c

char buf[256];
sprintf(buf, "It was %s\r\n", weather);
write(p->fd, buf, sizeof(buf));

上面的代码是一个大型项目的片段。

buf用于保存不同长度的多个不同字符串。我怎么知道写入函数的内容? sizeof()只是给了256我相信,因为写只会吐出一堆额外的垃圾字符。

3 个答案:

答案 0 :(得分:4)

使用len的代码版本应为:

char buf[256];
int len = snprintf(buf, sizeof buf, "It was %s\r\n", weather);

if ( len < 0 || len >= sizeof buf )
     // error handling, abort...

write(p->fd, buf, len);

使用sprintf存在风险,因为如果weather未完全由您控制,可能会导致缓冲区溢出。

正如其文档中所述,如果出现错误,sprintf系列可以返回负值;如果写入不适合缓冲区,则返回的值可能大于缓冲区大小。

其他答案涵盖的另一个选项是省略检查len,而是使用strlen来查找要发送的长度。有些人会认为不必要的低效率。此外,在这种情况下,您应该检查len以防encoding fails strlen,这会导致{{1}}对垃圾进行操作。

答案 1 :(得分:0)

解决方案是memset和strlen或sprintf return

的组合
char buf[256];
memset(buf,'\0',sizeof(buf));
sprintf(buf, "It was %s\r\n", weather);
write(p->fd, buf, strlen(buf));

OR

char buf[256];
    memset(buf,'\0',sizeof(buf));
    int len = sprintf(buf, "It was %s\r\n", weather);
    write(p->fd, buf, len);

答案 2 :(得分:0)

你是正确的sizeof()不能做你想做的事。

如何确定缓冲区中实际有效数据的数量取决于您将数据放在何处。在您的特定情况下,您可以使用sprintf()的返回值,也可以在缓冲区上使用strlen()。我会推荐前者,因为无论你是否使用它,sprintf()都将返回该值。这些替代方案中的任何一个都将排除字符串的尾随空字节,因此如果您想要写入该空字符串,请务必添加一个长度。

如果您在其他地方通过其他方式填充缓冲区,那么确定要写入多少字节的适当机制可能会有所不同。