我已经实现了一种将给定字符数组转换为十进制整数的方法。该方法从数组中取出每个字符,计算其十进制值并将其与 10^n 相乘,其中 n 随着每次迭代而递增。
So for example the array 4711 would be converted like this. 1*10^0 + 1*10^1 + 7*10^2 + 4*10^3 = 4711 as decimal value.
我现在的问题是如何扩展功能,以便 stringTOint 方法也能够处理八进制和十六进制值,例如023 或 0x1A。
/** Converts the given array of characters into a decimal integer */
int stringTOint(char str[]) {
int i, flag, offset, n,base;
flag = 0;
base = 10;
char c = '0';
/*if the first char in the array is '-', the minus flag gets set */
if (str[0] == '-') {
flag = -1;
}
if (flag == -1) {
offset = 1;
} else {
offset = 0;
}
if(offset == 0) {
if (str[0] == '0' && (str[1] != 'x' && str[1] != 'X') ) {
base = 8; // Octal
} else if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
base = 16; // Hexadecimal
offset = offset + 2;
}
}else if(offset == 1) {
if (str[1] == '0' && (str[2] != 'x' && str[2] != 'X') ) {
base = 8; // Octal
} else if (str[1] == '0' && (str[2] == 'x' || str[2] == 'X')) {
base = 16; // Hexadecimal
offset = offset + 2;
}
}
n = 0;
/*Loop runs until terminating NULL gets found in array */
for (i = offset; str[i] != '\0'; i++) {
n = n * base + str[i] - c;
}
/*value becomes negative if the negative flag was set */
if (flag == -1) {
n = -n;
}
/* n gets returned */
return n;
}
最佳答案
您没有处理十六进制值的 A
到 F
情况。
for (i = offset; str[i] != '\0'; i++) {
int value = (str[i] > ='A' && stri[i]<='F')? (str[i]-'A'+10):(str[i]-'0');
n = n * base + value;
}
也就是说,如果 char 是 A
到 F
,只需从 char
中减去 A
并添加 10
获取十六进制表示形式。
注意:需要使用%X
或%x
以十六进制表示法打印。
关于c - 八进制和十六进制的 stringTOint 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53518084/