缓冲区为3位数字

时间:2014-11-20 21:41:24

标签: c

我想为3位数字,状态和空字符创建一个缓冲区。目前我有

char buf[4];
sprintf(buf, "%d",status);

我的问题是这是否足以容纳一个3位数的号码,该号码从waitpid()

返回状态

4 个答案:

答案 0 :(得分:5)

是的,但是没有什么可以阻止用户(或者status被填充)冲击超过三位数并且溢出那个小缓冲区。

应该使用snprintf函数,它会切断太长的输入:

snprintf(buf, 4, "%d", status); // the 4 is the length of buf

答案 1 :(得分:1)

是:3个字符/数字和尾随空值。

答案 2 :(得分:0)

比抱歉更安全。

如果您希望它安全,请确保它真的是3位数字。

例如,您可以使用mod运算符:

char buf[4];
sprintf(buf, "%d",status % 1000);

请注意,如果您选择snprintf解决方案,并且您提供1001,那么您将获得100的结果,如果您使用此解决方案,您将获得1.

您可以选择更适合您的方式。

您也可以将两者结合起来:

snprintf(buf, sizeof(buf), "%d",status % 1000);

答案 3 :(得分:0)

严格的三位十进制是安全的,但waitpid()没有这样的保证;类型pid_t是一个32位有符号整数,三位数似乎是一个有点乐观的假设。 ÿ

你应该检查waitpid()返回值,以保证它适合你的缓冲区,但通常没有必要保留内存;一个12个字符的缓冲区将允许任何32位有符号整数表示为十进制字符串(最坏情况下为10位数字,符号字符和nul终结符)。类似地,对于16位,使用7和64位使用23.通常:

decimal_string_buffer_len = ceil(log(2 sizeof(type)* CHAR_BIT ))+ 3