我正在使用树莓派pico与C.我试图采取2个不同的十进制值char然后连接它们。我正在从射频识别中获取这些十进制值。来自rfid的值起初不是十进制的,我通过处理将这些值转换为十进制。
char *a;
char *b;
a = lltoa(decimal_2, 10);
printf(a);
b = lltoa(decimal, 10);
printf(b);
int newSize = strlen(a) + strlen(b) + 1;
char *newBuffer = (char *)malloc(newSize);
printf("n");
strcpy(newBuffer, a);
strcat(newBuffer, b);
printf(newBuffer);
输出为:
999210803000150
150210803000150
999是a的值正在变化。为什么char *a会改变?
这是我的lltoa函数(我从堆栈溢出):
char *lltoa(long long val, int base)
{
static char buf[64] = {0};
int i = 62;
int sign = (val < 0);
if (sign)
val = -val;
if (val == 0)
return "0";
for (; val && i; --i, val /= base)
{
buf[i] = "0123456789abcdef"[val % base];
}
if (sign)
{
buf[i--] = '-';
}
return &buf[i + 1];
}
在lltoa
函数中,您有:
static char buf[64] = {0};
当您将局部变量定义为static
时,这意味着只有一个变量的单个实例,在所有对该函数的调用之间共享。
所以当你调用lltoa(decimal_2, 10)
时,buf
的内容是单向设置的。然后在第二次调用lltoa(decimal, 10)
时,覆盖buf
的内容。
因为只有一个buf
,所以指针a
和b
都指向这一个buf
。
因为你想要能够处理不同的基数,你不能使用标准的snprintf
,否则我建议,所以我的建议是,你传递一个指针到一个足够大的缓冲区作为参数:
char *lltoa(long long val, int base, char *buf, size_t buflen);
问题包括:
只有一个缓冲区
参见@Some programmer dude。
缓冲区太小
当val == LLONG_MIN
和base == 2
时,预期输出需要一个大小为66的缓冲区。
未定义行为(UB)
val = -val;
是UBval == LLONG_MIN
。
而不是OP的这是我的lltoa函数(我从堆栈溢出)。
单个缓冲选择
传入缓冲区备选项。