#cpp
Вот такой код выводит "10" в консоль (VS2017): #includeint main() { int a = std::atoi("010"); std::cout << a << std::endl; } Т.е. ведущий ноль игнорируется, но на сколько это стандартизировано? Здесь и здесь не нашел.
Ответы
Ответ 1
Согласно стандарту С11 функция int atoi(const char *nptr); эквивалентна (int)strtol(nptr, (char **)NULL, 10) за исключением поведения при ошибке. В описании последней помимо прочего сказано: ... only letters and digits whose ascribed values are less than that of base are permitted. 0 является валидной десятичной цифрой, таким образом наличие предшествующих нулей не должно влиять на результат вызова. Наличие нуля в начале могло бы влиять при автоматическом определении основания системы счисления, т.е. при указании base = 0, но для atoi это не актуально.Ответ 2
Это стандарту соответствует - atoi работает с десятичным представлением. Если хотите, чтобы префикс 0 означал восьмеричное значение, а 0x - шестнадцатеричное - посмотрите, например, в сторону stoi или strtol с указанием основания системы счисления 0. P.S. Кстати, по вашей же ссылке четко сказано - takes an optional initial plus or minus sign followed by as many base-10 digits as possible, and interprets them as a numerical value.
Комментариев нет:
Отправить комментарий