我有一个长度为28的字符串,表示基数为16的1个数字。
long num=strtol(str,NULL,16);
但它适用于小字符串,但不是长字符串(它给了我一个否定的结果)。那么对于长字符串,我该如何翻译呢?
// --------------------------
嗯,我认为没有创造自行车只有一种方法。使用GMP。如此简单的代码以及如何使用GMP将是一个很好的答案。
答案 0 :(得分:2)
非常感谢@DavidSchwartz帮我评论。所以解决方案是使用GMP库:
mpz_t res;
mpz_init_set_str (res, str, 16);
gmp_fprintf(f1,"%s",mpz_get_str(NULL,10,res));
mpz_clear (res);
可能有些不对劲,但它以某种方式起作用。如果您发现错误让我知道,我会为未来的人改变它。
答案 1 :(得分:1)
由于代码以表示基数为16的整数的字符串开头,因此也可以使用字符串来表示基数为10的数字。
足够简单,一次转换一个数字。
空间管理留给OP。
#include <stdio.h>
#include <stdlib.h>
char *baseNtobase10(char *s10, const char *s16, int n) {
strcpy(s10, "0");
size_t len = strlen(s10);
while (*s16) {
char sdigit[] = { *s16, 0 };
char *endptr;
int digit = (int) strtol(sdigit, &endptr, n);
if (endptr == sdigit) return NULL; // detect illegal digits
// multiple s10[] = s10[] * n + digit
for (size_t i = len; i-- > 0; ) {
digit += (s10[i] - '0') * n;
s10[i] = digit % 10 + '0';
digit /= 10;
}
// handle carry oout
while (digit) {
memmove(s10 + 1, s10, len + 1);
*s10 = digit % 10 + '0';
digit /= 10;
len++;
}
s16++;
}
return s10;
}
int main(void) {
char s10[100];
puts(baseNtobase10(s10, "123", 10));
puts(baseNtobase10(s10, "123", 16));
puts(baseNtobase10(s10, "1234567890123456789012345678", 16));
return 0;
}
输出
123
291
369229998778771388878179932591736
答案 2 :(得分:0)
我打算建议strtoll
,但这只是16个字符或64位。我建议你使用bigint库,它有更高的限制。