Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Лидирующий “0” в std::atoi

#cpp


Вот такой код выводит "10" в консоль (VS2017):

#include 

int 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.

Комментариев нет:

Отправить комментарий