以下程序将结果赋予0而不是十六进制字符串常量的预期十进制等效值。
int my_htoi(char []);
int main(void){ 的printf(” …
错误的代码: i != '\0' 检查是否 指数 是0。
i != '\0'
for(i = 0; i != '\0'; ++i) {
应该在下面检查一下 元件 str[i] 是个 空字符 。
str[i]
for(i = 0; str[i] != '\0'; ++i) {
存在其他问题 不需要的增量 , int 溢出(更好用 unsigned 这里),错了 x 检测 - 考虑“0x0x0x1”,领先 - 要么 + , char str[] - > const char str[] ,...
int
unsigned
x
-
+
char str[]
const char str[]
您的代码中存在一些问题:
循环索引 i 与...相比 '\0' 代替 str[i] ,导致循环立即终止,返回值为 0 。
i
'\0'
0
测试 x 是不正确的:它会导致 "1x2" 转换为 2 代替 1 。
"1x2"
2
1
你接受超越的信件 f 并将它们转换为数字。该函数应该停止解析第一个不是十六进制数字的字符。
f
这是一个更正版本:
#include <stdio.h> int my_htoi(const char[]); int main(void) { printf("%d", my_htoi("0xABC")); return 0; } int my_htoi(const char str[]) { int i = 0, num = 0; if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) i += 2; for (; str[i] != '\0'; ++i) { 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); } else { break; } } return num; }