以下程序给出的结果为 0
,而不是十六进制字符串常量的预期十进制等价物。
#include <stdio.h>
int my_htoi(char[]);
int main(void) {
printf("%d", my_htoi("0xABC"));
return 0;
}
int my_htoi(char str[]) {
int i, num = 0;
for (i = 0; i != '\0'; ++i) {
if (str[i+1] == 'x' || str[i+1] == 'X') {
i = i + 1;
continue;
}
if (str[i] >= '0' && str[i] <= '9') {
num = num * 16 + (str[i] - '0');
} else if (str[i] >= 'a' && str[i] <= 'f') {
num = num * 16 + (str[i] - 'a' + 10);
} else if (str[i] >= 'A' && str[i] <= 'F') {
num = num * 16 + (str[i] - 'A' + 10);
}
}
return num;
}
虽然以下程序运行良好并输出十六进制字符串常量的正确十进制等价物。
#include <stdio.h>
#include <string.h>
int my_htoi(char[]);
int main(void) {
printf("%d", my_htoi("0xABC"));
return 0;
}
int my_htoi(char str[]) {
int i, num = 0;
for (i = 0; i < strlen(str); ++i) {
if (str[i+1] == 'x' || str[i+1] == 'X') {
i = i + 1;
continue;
}
if (str[i] >= '0' && str[i] <= '9') {
num = num * 16 + (str[i] - '0');
} else if (str[i] >= 'a' && str[i] <= 'f') {
num = num * 16 + (str[i] - 'a' + 10);
} else if (str[i] >= 'A' && str[i] <= 'F') {
num = num * 16 + (str[i] - 'A' + 10);
}
}
return num;
}
唯一的区别在于我们找到循环的合格条件的方式。为什么它不适用于空字节检查?
最佳答案
错误的代码:i != '\0'
检查 index 是否为 0。
for(i = 0; i != '\0'; ++i) {
应该是下面检查元素 str[i]
是否是空字符。
for(i = 0; str[i] != '\0'; ++i) {
存在其他问题 unneeded increment , int
溢出(这里最好使用 unsigned
),错误的 x
检测 - 考虑“0x0x0x1”,前导 -
或者 +
, char str[]
--> const char str[]
, ...
关于使用C将十六进制字符串常量转换为十进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55049588/