2

最初の N 個の数字を BASE62 エンコーディングで出力したいと思います。私のコードで何が問題になっていますか?

const char ALPHABET[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main(void) {
    int N = 50;
    for (int i = 0; i < N; i++) {
        int base62 = ALPHABET[i % 62];
        printf("Base 62: %s\n", (char*)base62);
    }
}
4

3 に答える 3

2

ALPHABETchar base 62 ...は文字の配列なので、 andを使用しても問題ないはずですprintf("Base 62: %c\n", base62);

元のコードのように法線intをポインターにキャストし、それを printf に渡すと、printf が無効なメモリー読み取りを行うことになります (未定義の動作)。

于 2015-04-07T14:02:57.457 に答える
1

単純化を受け入れた後

Cool Guyがコメントしたように、 は、 を目的の文字配列にprintf("Base 62: %s\n", (char*)base62);変換しません。int以下のコードは、一度に 1 つの base-62 文字で値を分解します。

void print_base(unsigned n, unsigned base) {
  static const char ALPHABET[] =
      "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if (n >= base) {
    print_base(n / base, base);
  }
  fputc(ALPHABET[n % base], stdout);
}

#include <stdio.h>
int main(void) {
  print_base(100, 10); // 100
  puts("");
  print_base(100, 16); // 64
  puts("");
  print_base(100, 62); // 1C
  puts("");
  return 0;
}
于 2015-04-07T17:21:11.580 に答える