char buf[256];
sprintf(buf, "It was %s\r\n", weather);
write(p->fd, buf, sizeof(buf));
上面的代码是一个大型项目的片段。
buf
用于保存不同长度的多个不同字符串。我怎么知道写入函数的内容? sizeof()
只是给了256
我相信,因为写只会吐出一堆额外的垃圾字符。
答案 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()
都将返回该值。这些替代方案中的任何一个都将排除字符串的尾随空字节,因此如果您想要写入该空字符串,请务必添加一个长度。
如果您在其他地方通过其他方式填充缓冲区,那么确定要写入多少字节的适当机制可能会有所不同。