试图连接两个指针字符,但其中一个正在改变
trying to concat two pointer char but one of them is changing
我在 C 中使用 Raspberry Pi pico。我试图将 2 个不同的十进制值转换为 char,然后将它们连接起来。我正在从 rfid 中获取这些十进制值。 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
a的值999正在变化。为什么 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);
问题包括:
只有一个缓冲区
参见 。
缓冲区太小
当 val == LLONG_MIN
和 base == 2
时,预期输出需要大小为 66 的缓冲区。
未定义的行为 (UB)
val = -val;
是 UB val == LLONG_MIN
.
而不是 OP 的 这是我的 lltoa 函数(我从堆栈溢出中获取)。
单缓冲区alternative
已传入缓冲区 alternative。
我在 C 中使用 Raspberry Pi pico。我试图将 2 个不同的十进制值转换为 char,然后将它们连接起来。我正在从 rfid 中获取这些十进制值。 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
a的值999正在变化。为什么 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);
问题包括:
只有一个缓冲区
参见
缓冲区太小
当 val == LLONG_MIN
和 base == 2
时,预期输出需要大小为 66 的缓冲区。
未定义的行为 (UB)
val = -val;
是 UB val == LLONG_MIN
.
而不是 OP 的 这是我的 lltoa 函数(我从堆栈溢出中获取)。
单缓冲区alternative
已传入缓冲区 alternative。