打印 BASE62 中的前 N ​​个数字

Print first N numbers in BASE62

我想以 BASE62 编码打印前 N 个数字。我的代码有什么问题?

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);
    }
}

ALPHABET 是一个字符数组,所以你应该可以使用 char base 62 ...printf("Base 62: %c\n", base62);

将普通的 int 转换为指针并将其传递给原始代码中的 printf 将导致 printf 进行无效的内存读取(未定义的行为)。

您需要打印出表示 base62 数字的字符串。对于 N >= 62,您将得到一个多字符字符串。 首先,您需要计算 base62 表示中的位数,然后逐个字符显示。

为此,您需要这样的东西-

// Count the number of characters the number will need
int num_digits(int num) {
   int count=0;
   while(num > 0) {
      num /= 62;
      count++;
   }
   if(count == 0)
      count = 1;
   return count;
}

int main() {
   const char ALPHABET[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   int i, N=100;
   char STR[10];

   for (i = 0; i < N; i++) {
      int num = i;
      int digits = num_digits(num);
      STR[digits] = '[=10=]';

      while(num > 0) {
         char base62 = ALPHABET[num % 62];
         STR[--digits] = base62;
         num /= 62;
      }

      if(i == 0)
         STR[--digits] = ALPHABET[0];
      printf("%s\n", i, STR);
   }
}

接受简化后

正如 Cool Guy 评论的那样,printf("Base 62: %s\n", (char*)base62); 不会将 int 转换为所需的字符数组。下面的代码分解值,一次分解一个 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;
}