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

250
17 декабря 2017, 10:33

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

#include <iostream>
int main() {
  int a = std::atoi("010");
  std::cout << a << std::endl;
}

Т.е. ведущий ноль игнорируется, но на сколько это стандартизировано?
Здесь и здесь не нашел.

Answer 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 это не актуально.

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

READ ALSO
Объявление функции n переменных

Объявление функции n переменных

Есть число nКак объявить функцию n переменных одного типа? Ситуация примерно такая:

231
Реализация алгоритма COS

Реализация алгоритма COS

Ребят, помогите найти код алгоритма COS(дискретное логарифмирование), очень надо

210
Реализация алгоритма Адлемана [требует правки]

Реализация алгоритма Адлемана [требует правки]

Ребят, помогите, пожалуйста найти код алгоритм Адлемана, очень надо

260
Java и mysql udf [требует правки]

Java и mysql udf [требует правки]

Как написать свою UDF для mysql на java? (для желающих больших вопросов добавлено) - нужны ссылки как надо написать на java, а не на С, что вызывать, как...

233