在BASE62中打印前N个数字

时间:2015-04-07 13:51:14

标签: c loops printf 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);
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您需要打印出表示base62中的数字的字符串。对于N&gt; = 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] = '\0';

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

答案 2 :(得分:1)

接受简化后

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