我试图将uint64_t数组解析为char数组(结果为十进制,用逗号分隔(。
我使用memcpy,每次我得到一个随机值。iota((函数转换最大uint32_t值。我尝试将uint64_t分离为2 uint32_t,但始终没有得到正确的结果。
uint64_t numbers[10] = { 201234567890123456,
12345678901234567890,
98765432109876543,
65432109887,
12345234512345,
217631276371261627,
12354123512453124,
2163521442531,
2341232142132321,
1233432112 };
char array[1000] = "";
预期结果:
array = "201234567890123456,12345678901234567890,98765432109876543,65432109887,12345234512345,217631276371261627,12354123512453124,2163521442531,2341232142132321,1233432112"
我尝试了这个主题的int64ToChar,但结果是:
void uint64ToChar(char a[], int64_t n) {
memcpy(a, &n, 10);
}
uint64_t number = 12345678900987654;
char output[30] = "";
uint64ToChar(output, number);
Result:
�g]T�+
谢谢你的帮助。
Uesnpintf()
转换64位数字:
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>
int main() {
uint64_t numbers[10] = { 201234567890123456,
12345678901234567890,
98765432109876543,
65432109887,
12345234512345,
21763127637126371627,
12354123512453124,
2163521442531,
2341232142132321,
1233432112 };
char array[1000];
size_t i, n = sizeof(numbers) / sizeof(numbers[0]), pos = 0;
for (i = 0; i < n && pos < sizeof(array); i++) {
pos += snprintf(array + pos, sizeof(array) - pos, "%"PRIu64"%s", numbers[i],
i < n - 1 ? "," : "");
}
printf("%sn", array);
return 0;
}
如果所有数据在编译时都可用,那么就没有明显的理由应该使用像s*printf这样的慢速运行时转换函数。只需在预处理器阶段完成所有操作:
#define INIT_LIST
201234567890123456,
12345678901234567890,
98765432109876543,
65432109887,
12345234512345,
217631276371261627,
12354123512453124,
2163521442531,
2341232142132321,
1233432112
#define STR_(...) #__VA_ARGS__
#define STR(x) STR_(x)
int main (void)
{
uint64_t numbers[10] = { INIT_LIST };
char array[] = STR(INIT_LIST);
puts(array);
}
如果你想微观管理逗号和数字之间的空格位置等,可以使用"X宏"进行更高级的替代。
请注意,在我的64位系统中,12345678901234567890
太大,不能作为有效的有符号整数常数,最大值为2^63 - 1
=9.22*10^18
,但这个数字为12.34*10^18
。我必须把它改为12345678901234567890ull
才能编译这个程序,因为最大值是18.44*10^18
。
您可以通过在for
循环中使用sprintf_s
来实现这一点。
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#define BUFSIZE 22 /* string buffer size to support a single 64 bit unsigned integer */
#define ARRSIZE 10 /* size of the unsigned integer array */
#define STRSIZE BUFSIZE * ARRSIZE /* max size of the string of unsigned integer array */
int main()
{
int i;
char num_str[STRSIZE] = "";
uint64_t num_arr[ARRSIZE] = {
201234567890123456,
12345678901234567890,
98765432109876543,
65432109887,
12345234512345,
2176312763712637162,
12354123512453124,
2163521442531,
2341232142132321,
1233432112
};
for (i = 0; i < ARRSIZE; i++)
{
/* convert an unsigned integer to a string and concatenate to previous string every loop */
sprintf_s(num_str + strlen(num_str), BUFSIZE, "%llu,", num_arr[i]);
}
num_str[strlen(num_str) - 1] = 0; /* truncate the trailing comma */
printf("%s", num_str);
return 0;
}
这导致:
num_str = "201234567890123456,12345678901234567890,98765432109876543,65432109887,12345234512345,2176312763712637162,12354123512453124,2163521442531,2341232142132321,1233432112"
memcpy
函数逐字节从一个位置复制到另一个位置。您要做的是将64位数字中的10个字节(仅包含8个字节(重新解释为ASCII字符。这不仅不会给出您期望的结果,而且您还可以通过读取对象的内存边界来调用未定义的行为。
猜测函数的作用是学习C的一种糟糕方法。你需要阅读这些函数的文档(在Linux上运行"man function_name"以获取有问题的函数,或者在learn.microsoft.com上搜索MSVC(来了解它们的作用。
如果使用sprintf
函数,则可以将64位整数转换为字符串。%lld
标识符接受至少与uint64_t
一样大的long long int
。
sprintf(a, "%lld", (unsigned long long)n);