Следующая программа возвращает результат в виде 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
с нулем, что не имеет смысла. Вместо этого вы должны сравнитьstr[i]
с ним. - person Eugene Sh.   schedule 07.03.2019i=i+1
, если встречающийся char равен 'x' или 'X', является ошибкой. Когда выполняетсяcontinue
,for
выполняет приращение переменнойi
, тогда ваш код, когда встречается "x", пропускает первый символ после "x". - person Sir Jo Black   schedule 07.03.2019