2

uint64_t 配列を char の配列に解析しようとしました (結果は 10 進数で、コンマで区切られています)。

ランダムな値を取得するたびに、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�+

助けてくれてありがとう。

4

4 に答える 4

2

Ue snpintf() to convert the 64-bit numbers:

#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;
}
于 2020-03-22T19:50:32.013 に答える
2

コンパイル時にすべてのデータが利用可能である場合、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ます。

于 2020-03-23T14:08:25.533 に答える