我想先用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);
}
}发布于 2015-04-07 14:38:45
您需要打印出表示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] = '\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);
}
}发布于 2015-04-07 14:02:57
ALPHABET是一个字符数组,所以您应该可以使用char base 62 ...和printf("Base 62: %c\n", base62);。
将普通的int转换为指针,并将其传递给printf (如原始代码中的那样),将导致printf产生无效的内存读取(未定义的行为)。
发布于 2015-04-07 17:21:11
接受简化后
正如Cool Guy所评论的那样,printf("Base 62: %s\n", (char*)base62);不会将int转换为所需的字符数组。下面的代码分解了这个值,一次只有一个基数-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;
}https://stackoverflow.com/questions/29493247
复制相似问题