[英]uint64_t to an array - C language
我試圖將 uint64_t 數組解析為一個字符數組(結果為十進制,以逗號分隔)。
我使用 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�+
謝謝你的幫助。
使用snpintf()
轉換 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("%s\n", 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 宏”進行更高級的替代。
請注意, 12345678901234567890
在我的 64 位系統上太大,不能成為有效的有符號整數常量,最大值是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 位數字(僅包含 8 個字節)的 10 個字節,並將它們中的每一個重新解釋為 ASCII 字符。 這不僅不會給出您期望的結果,而且您還會通過讀取對象的內存邊界來調用未定義的行為。
猜測函數的作用是學習 C 的一種糟糕方法。您需要閱讀這些函數的文檔(在 Linux 上運行“man function_name”以獲取相關函數或搜索 docs.microsoft.com 以獲取 MSVC)以了解它們的作用.
如果使用sprintf
函數,則可以將 64 位整數轉換為字符串。 %lld
標識符接受long long int
,它至少與uint64_t
一樣大。
sprintf(a, "%lld", (unsigned long long)n);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.