C 如何计算write()使用了多少缓冲区(大小)?

C 如何计算write()使用了多少缓冲区(大小)?,c,C,上面的代码是一个大型项目的片段 buf用于保存不同长度的多个不同字符串。我如何知道在write函数中放入什么sizeof()我相信只会给出256,因为write只会抛出一堆额外的垃圾字符。解决方案是memset和strlen或sprintf return的组合 char buf[256]; sprintf(buf, "It was %s\r\n", weather); write(p->fd, buf, sizeof(buf)); 或 解决方案是memset和strlen或sprintf

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


buf
用于保存不同长度的多个不同字符串。我如何知道在write函数中放入什么
sizeof()
我相信只会给出
256
,因为write只会抛出一堆额外的垃圾字符。

解决方案是memset和strlen或sprintf return的组合

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


解决方案是memset和strlen或sprintf return的组合

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


您认为
sizeof()
不符合您的要求,这是正确的

如何确定缓冲区中实际有多少有效数据取决于如何将数据放入缓冲区。在您的特定情况下,您可以使用
sprintf()
的返回值,也可以在缓冲区上使用
strlen()
。我建议使用前者,因为无论您是否使用它,
sprintf()
都将返回该值。这两个选项中的任何一个都将排除字符串后面的空字节,因此如果您也要写入该空字节,请确保在长度中添加一个


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

您正确地认为
sizeof()
不符合您的要求

如何确定缓冲区中实际有多少有效数据取决于如何将数据放入缓冲区。在您的特定情况下,您可以使用
sprintf()
的返回值,也可以在缓冲区上使用
strlen()
。我建议使用前者,因为无论您是否使用它,
sprintf()
都将返回该值。这两个选项中的任何一个都将排除字符串后面的空字节,因此如果您也要写入该空字节,请确保在长度中添加一个


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

使用
len
的代码版本应为:

char buf[256];
    memset(buf,'\0',sizeof(buf));
    int len = sprintf(buf, "It was %s\r\n", weather);
    write(p->fd, buf, len);
charbuf[256];
int len=snprintf(buf,sizeof buf,“这是%s\r\n”,天气);
如果(len<0 | | len>=sizeof buf)
//错误处理,中止。。。
写入(p->fd、buf、len);
使用
sprintf
是有风险的,因为如果
weather
不完全在您的控制之下,它可能会导致缓冲区溢出

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


其他答案涵盖的另一个选项是省略检查
len
,而是使用
strlen
查找要发送的长度。有些人会认为不必要的低效。此外,在这种情况下,您应该确实检查
len
,以防
strlen
在垃圾上运行。

使用
len
的代码版本应为:

char buf[256];
    memset(buf,'\0',sizeof(buf));
    int len = sprintf(buf, "It was %s\r\n", weather);
    write(p->fd, buf, len);
charbuf[256];
int len=snprintf(buf,sizeof buf,“这是%s\r\n”,天气);
如果(len<0 | | len>=sizeof buf)
//错误处理,中止。。。
写入(p->fd、buf、len);
使用
sprintf
是有风险的,因为如果
weather
不完全在您的控制之下,它可能会导致缓冲区溢出

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


其他答案涵盖的另一个选项是省略检查
len
,而是使用
strlen
查找要发送的长度。有些人会认为不必要的低效。此外,在这种情况下,您应该检查
len
,以防
strlen
在垃圾上运行。

您是否阅读了上的文档?也许您想要
strlen()
strlen()
正是我所需要的。谢谢您是否阅读了上的文档?也许您想要
strlen()
strlen()
正是我所需要的。谢谢我在tutorialspoint.com上看到了这一点,但我不明白为什么我需要
memset
。因为在声明数组时,数组的所有索引都包含垃圾值。您不希望垃圾值影响您的功能。例如,对于字符串,它们必须以“\0”字符结尾,才能使strlen()正常工作。但是如果不使用memset,端点将包含一些垃圾字符,strlen()将给出错误的结果
memset
strlen
版本中,在case
sprintf
中非常有用。这是为了
strlen
查找
0
,而不是尝试读取未初始化的缓冲区。但是您只需要将
buf[0]=0,而不是全部。@Yasir Majeed“如果不执行memset,端点将包含一些垃圾”是不正确的
sprintf()
将附加所需的
'\0'
。检查
sprintf()
的返回值以检测失败。我在tutorialspoint.com上看到了这一点,但我不明白为什么需要
memset
。因为在声明数组时,数组的所有索引都包含垃圾值。您不希望垃圾值影响您的功能。例如,对于字符串,它们必须以“\0”字符结尾,才能使strlen()正常工作。但是如果不使用memset,端点将包含一些垃圾字符,strlen()将给出错误的结果
memset
strlen
版本中,在case
sprintf
中非常有用。这是为了
strlen
查找
0
,而不是尝试读取未初始化的缓冲区。但是您只需要将
buf[0]=0,而不是全部。@Yasir Majeed“如果不执行memset,端点将包含一些垃圾”是否定的