我想为3位数字,状态和空字符创建一个缓冲区。目前我有
char buf[4];
sprintf(buf, "%d",status);
我的问题是这是否足以容纳一个3位数的号码,该号码从waitpid()
返回状态答案 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