【发布时间】:2014-09-05 17:40:18
【问题描述】:
根据top answer on SO,这是我在 C 中将整数转换为字符串时应该做的:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <math.h>
#define digits(x) ((int)((ceil(log10(abs(x)))+1)*sizeof(char)))
int main () {
int a = 345908220;
long b = 23094809284358;
unsigned int c = 3456789234;
uint8_t d = 242;
int64_t e = -840958202029834;
int dstr_len = digits(a) + digits(b) + digits(c) +
digits(d) + digits(e) + 5;
char dstr[dstr_len];
sprintf(dstr, "%d %ld %u %u %" PRIu64, a, b, c, d, e);
printf("%s\n", dstr);
return 0;
}
但是,这似乎效率低得离谱。我必须将我的程序链接到 libmath,并对我想要打印的每个整数进行 三个 数学调用。另请注意,通过计算格式字符串中的空格数,我必须将5 添加到我的缓冲区中,而不仅仅是1 用于NUL 终止符。这似乎也容易出错,并可能导致缓冲区溢出。
那么,有没有什么好的标准函数可以为我计算缓冲区的大小?
我正在尝试编写安全的 C。
【问题讨论】:
-
您始终可以自己编写。这并不难(并且可能非常有效),但需要考虑处理“边缘”情况,例如大型 64 位值。
标签: c string string-formatting unsigned