我对以下代码有疑问:
void testing(int idNumber)
{
char name[20];
snprintf(name, sizeof(name), "number_%d", idNumber);
}
char数组name
的大小为20,所以如果idNumber
为111
则有效,但实际的idNumber为111111111111111111111111111111
,如何确定char数组应该有多大才能保持snprintf
的结果?
答案 0 :(得分:3)
好吧,如果您的平台上int
是32位,那么它可以打印的最宽值是21亿,即11个字符,因此number_
需要7个,11个对于%d
,对于null终止符为1,因此总共为19。
但是你应该检查snprintf()
的返回值,以确保你有足够的空间。例如,如果“区域设置”设置为标准“C”之外的其他区域,则可以打印数千个分隔符,在这种情况下,您需要多于2个字符。
答案 1 :(得分:2)
查看snprintf的文档。如果为目标传递NULL而为大小传递0,则它将返回所需的字节数。所以你首先要做的就是对内存进行malloc操作,并使用正确的大小做另一个snprintf。
所有printf函数都返回打印的字节数(不包括尾随零),除非长度不受限制,否则snprintf将返回 打印的字符数。
答案 2 :(得分:2)
只有一个好的答案:
问snprintf
本身(传递长度为0)。
如果缓冲区足够大,则返回它将写入的输出的大小,不包括终止0。
标准报价(C99 +修正案):
7.21.6.5 snprintf函数
概要
#include <stdio.h> int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
描述
2snprintf
函数等效于fprintf
,但输出被写入 数组(由参数s
指定)而不是流。如果n
为零,则不写任何内容, 并且s
可以是空指针。否则,输出超出n-1
st的字符 丢弃而不是写入数组,并在末尾写入空字符 实际写入数组的字符。如果在对象之间进行复制 重叠,行为是不确定的 返回
3snprintf
函数返回已写入的字符数 已n
足够大,不计算终止空字符,或负数 如果发生编码错误,则为value。因此,空终止输出已经 当且仅当返回的值是非负且小于n
时才完全写入。
答案 3 :(得分:1)
引自here:
如果结果字符串长度超过n-1个字符,则为 剩余的字符将被丢弃并且不会被存储,但会计入 函数返回的值。
答案 4 :(得分:1)
要使用适当大小的缓冲区,请计算其最大需求。
#define INT_PRINT_SIZE(i) ((sizeof(i) * CHAR_BIT)/3 + 3)
void testing(int idNumber) {
const char format[] = "number_%d";
char name[sizeof format + INT_PRINT_SIZE(idNumber)];
snprintf(name, sizeof(name), format, idNumber);
}
此方法假定为C语言环境。可以使用更强大的解决方案
...
int cnt = snprintf(name, sizeof(name), format, idNumber);
if (cnt < 0 || cnt >= sizeof(name)) Handle_EncodingError_SurprisingLocale().