这是一个非常基本的问题,我知道一种方法是执行以下操作:
char buffer[33];
itoa(aq_width, buffer,10);
其中aq_width是int,但是我不能保证为了做到这一点我需要多大的缓冲区...我总是可以分配一个非常大的缓冲区大小,但这不会很好。 ..任何其他漂亮而简单的方法吗?
答案 0 :(得分:4)
std::stringstream ss;
ss << 3;
std::string s = ss.str();
assert(!strcmp("3", s.c_str()));
答案 1 :(得分:2)
您可以使用此宏(对于签名类型)计算缓冲区所需大小的上限:
#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type) - 1) / 3 + 2)
顺便说一下,itoa()
不是标准C,并不是随处可用。 snprintf()
将完成这项工作:
char buffer[MAX_SIZE(aq_width)];
snprintf(buffer, sizeof buffer, "%d", aq_width);
答案 2 :(得分:0)
来自glibc的一个很好的函数是asprintf
,像
char * buffer = NULL;
int buffer_size = asprintf(&buffer,"%d",aq_width);
assert(buffer_size >= 0);
...
free(buffer)
将为您分配缓冲区。
您可以更方便地使用snprintf
,这将返回您需要分配的字符数。
答案 3 :(得分:0)
有更多内存有效的方法,但它们并不“简单”。
考虑100字节内存的成本,比如一秒钟。一年十亿的千兆字节成本,10美元?我们在这里谈论纳米抗体。
使缓冲区太大。请注意,32位int
的十进制数不能超过10位,而64位的int不能超过20位。