我有一个长度为28的字符串,它以16为基数表示1个数字。
long num=strtol(str,NULL,16);
但它适用于小字符串,而不是长字符串(它给了我一个否定的结果)。那么对于长字符串,我该如何翻译呢?
//--------------------------
好吧,我认为只有一种方法不创造自行车。使用GMP。所以简单的代码如何使用GMP将是很好的答案。
最佳答案
由于代码以表示以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
关于c - c-long int太小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37402377/