0

入力の使用に基づいて多数を 16 進数に変換するコードを作成しました。ただし、結果が出力されると、数値の一部のみが 16 進数に変換され、配列には他のランダムな値が含まれます。

例: 10 進数 = 1234567891012 ---- 16 進数 = 00 00 00 02 00 00 00 65 00 6b 42 48 71 fb 08 44

最後の 4 つの値 ( 71 FB 08 44) は正しい 16 進数値ですが、他の値は正しくありません

uint8_t buf[]; を使用しています。

コード:

int main()
{
  uint8_t buf[] = {0};

 long int i,a;

      printf("Enter Number: ");
      scanf("%d", &buf);

      printf("\n");
      printf("Input #: ");

      /* put a test vector */
      for (i = 15; i >= 0; i--)
         {
         printf("%02x ", buf[i]);
          }
           printf("\n\n");

          printf("\n\n");

      printf("%d\n",sizeof(buf));


    system("pause");
    return 0;
}
4

2 に答える 2

1

免責事項:ソースコードを提供していないため、いくつかのことを想定します。

unsigned intこれは、お使いのコンピューターでのみ 32 ビットである 10 進数を格納していたために発生します。a を使用しunsigned longて、その大きさの小数を格納します。

unsigned long decimal = 12345678901012L;

また、16 バイトの 10 進数の場合は、GMP Libを使用します。

- - 編集 - -

scanf("%lu", &decimal)ロング 10 進数に格納するには、 を使用する必要があります。scanf("%d", &decimal) は、お使いのマシンではおそらく 32 ビットの "integer(signed)" のみをコピーします!

于 2013-02-15T15:03:55.673 に答える
0

コードを投稿すると、問題がより明らかになります。

まずこれ:

uint8_t buf[] = {0};

ダメです。配列にサイズを割り当てる (または動的にする) 必要があるため、要素にアクセスしようとすると「ガベージ」が発生します。今のところ、任意のサイズを指定できます。

uint8_t buf[100] = {0};

これにより、「ガベージ」値の問題が修正されます。

int2 番目の問題は、通常のサイズの値を期待している場合のスキャンです。次"%d"のような、より大きな値を探すように指示する必要があります。

scanf("%llu", &buf[0]); 

それでも、制限に対して入力を検証する必要があります。ユーザー入力が LONG_MAX または INT_MAX または任意のタイプの範囲内にあることを確認してください。

于 2013-02-15T15:12:45.190 に答える