我想在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);
}
}
答案 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;
}