std :: stoi () занимает первое число в строке?

Я конвертировал строковые значения в целочисленные значения с помощью std :: stoi () в моей программе, когда заметил, что он возвращает целочисленное значение 25 из строкового значения «25».

Это смутило меня, потому что есть исключение для invalid_argument, когда строка начинается с чего-либо, кроме числа. Для примера «25» будет выброшено invalid_exception. Основываясь на этом, я сделал предположение, что если все строковое значение не было числом, то было выдано исключение. Это не тот случай, когда я осознаю это. Для примера «25,543» вернет 25.

Я закончил тем, что создал свою собственную функцию для вызова std :: stoi (), только если все строковое значение является числом, в противном случае выдается исключение invalid_argument.

С учетом сказанного, мне было интересно, почему он был разработан таким образом, или, возможно, я не понимаю, как это работает полностью. Я скорее не буду использовать его, если буду продолжать получать сюрпризы, подобные этой реализации.

Обновление: я проверил документацию на cppreference.com, но у меня недостаточно опыта, чтобы получить ее полностью. Я попытался перепроектировать определение std :: stoi, но понял, что оно намного выше моего уровня опыта. Я разместил этот вопрос с намерением как сообщить другим о его функциональности, так и о желании узнать все о мелочах.

-5

Решение

Согласно стандарту C ++ (N4296),

§ 21,5

21.5 Числовые преобразования [string.conversions]

  1. Последствия: вызов первых двух функций strtol(str.c_str(), ptr, base)и последние три функции
    вызов strtoul(str.c_str(), ptr, base), strtoll(str.c_str(), ptr, base), а также strtoull(
    str.c_str(), ptr, base)
    соответственно. Каждая функция возвращает преобразованный результат, если таковой имеется. Аргумент
    ptr обозначает указатель на объект, внутренний для функции, которая используется для определения того, что
    хранить в *idx, Если функция не выдает исключение и idx != 0функция хранится в
    *idx индекс первого неконвертированного элемента ул.
  2. Возвращает: Преобразованный результат.
  3. Броски: invalid_argument если strtol, strtoul, strtoll, или же strtoull сообщает, что нет конверсии
    может быть выполнено. Броски out_of_range если strtol, strtoul, strtoll или же strtoull наборы errno в
    ERANGEили если преобразованное значение находится за пределами диапазона представимых значений для возвращаемого типа.

Что такое strtol?

§ 21,8

21.8 Утилиты с нулевой терминальной последовательностью [c.strings]

  1. таблицы 74, 75, 76, 77, 78, и 79 описывают заголовки <cctype>, <cwctype>, <cstring>, <cwchar>, <cstdlib>
    (преобразования символов) и <cuchar>соответственно.
  2. Содержимое этих заголовков должно быть таким же, как заголовки стандартной библиотеки C <ctype.h>, <wctype.h>,
    <string.h>, <wchar.h>, а также <stdlib.h> и заголовок C Unicode TR <uchar.h>соответственно с
    следующие модификации:

Таблица 78 — Заголовок <cstdlib> конспект

Введите имя (имена)
Макросы: MB_CUR_MAX
Функции:
Atof Mblen Strtof strtoul
атой мбтовец Strtol Strtoull
atol mbstowcs strtold wctomb
Atoll Strtod strtoll wcstombs

Что означает Standard C Library?

§ 1.2

1.2 Нормативные ссылки [intro.refs]

  1. Следующие ссылочные документы являются обязательными для применения этого документа. Для датированных ссылок,
    применяется только указанное издание. Для недатированных ссылок, последняя редакция ссылочного документа
    (включая любые поправки) применяется.

    (1.3) — ISO / IEC 9899: 1999, Языки программирования — C
    (1.4) — ISO / IEC 9899: 1999 / Cor.1: 2001 (E), Языки программирования — C, Техническое исправление 1
    (1.5) — ISO / IEC 9899: 1999 / Cor.2: 2004 (E), Языки программирования — C, Техническое исправление 2

  2. Библиотека, описанная в разделе 7 ИСО / МЭК 9899: 1999 и в разделе 7 ИСО / МЭК 9899: 1999 / Cor.1: 2001
    и пункт 7 ISO / IEC 9899: 1999 / Cor.2: 2003 в дальнейшем называется стандартной библиотекой C.1

Итак, нам нужно смотреть стандарт C99.

Согласно стандарту C99 (N1124)

§7.20.1.4

7.20.1.4 Функции strtol, strtoll, strtoul и strtoull

  1. Описание
    strtol, strtoll, strtoul, а также strtoull функции преобразовать начальную часть строки, на которую указывает nptr в long int, long long int, unsigned long int, а также unsigned long long int представление соответственно. Сначала они разбивают входную строку на три части: начальную, возможно, пустую, последовательность
    символы пробела (как указано в isspace функция), субъектная последовательность, напоминающая целое число, представленное в некотором радиксе, определяемом значением baseи конечная строка из одного или нескольких нераспознанных символов, включая завершающий нулевой символ входной строки. Затем они пытаются преобразовать последовательность объекта в целое число и вернуть результат.
  2. Если значение base равно нулю, ожидаемая форма предметной последовательности представляет собой целочисленную константу, как описано в 6.4.4.1, необязательно с предшествующим знаком плюс или минус, но не включая суффикс целого числа. Если значение base от 2 до 36 (включительно), ожидаемая форма предметной последовательности представляет собой последовательность букв и цифр, представляющих целое число с основанием, заданным как base, необязательно предшествует знак плюс или минус,
    но не включая целочисленный суффикс. Письма от a (или же A) через z (или же Z) присвоены значения от 10 до 35; только буквы и цифры, приписанные значения которых меньше значений base разрешены Если значение base 16 символов 0x или же 0X может факультативно предшествовать последовательности букв и цифр, следуя за знаком, если он присутствует.
  3. Предметная последовательность определяется как самая длинная начальная подпоследовательность входной строки, начиная с первого символа, не являющегося пробелом, в ожидаемой форме. Субъектная последовательность не содержит символов, если входная строка пуста или полностью состоит из пробелов, или если первый символ, не являющийся пробелом, отличается от знака или допустимой буквы
    или цифра.
  4. Если предметная последовательность имеет ожидаемую форму и значение base равно нулю, последовательность символов, начинающаяся с первой цифры, интерпретируется как целочисленная константа в соответствии с правилами 6.4.4.1. Если предметная последовательность имеет ожидаемую форму и значение base находится между 2 и 36, он используется в качестве основы для преобразования, приписывая каждой букве свое значение, как указано выше. Если предметная последовательность начинается со знака минус, значение, полученное в результате преобразования, отменяется (в типе возврата). Указатель на последнюю строку хранится в объекте, на который указывает endptr, при условии, что endptr не является нулевым указателем
  5. В отличие от "C" locale, могут быть приняты дополнительные формы предметной последовательности, зависящие от локали.
  6. Если предметная последовательность пуста или не имеет ожидаемой формы, преобразование не выполняется; значение nptr хранится в объекте, указанном endptr, при условии, что endptr не является нулевым указателем
  7. Возвращает
    strtol, strtoll, strtoul, а также strtoull функции возвращают преобразованное значение, если оно есть. Если преобразование не может быть выполнено, возвращается ноль. Если правильное значение находится вне диапазона представимых значений, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, ULONG_MAX, или же ULLONG_MAX возвращается (в соответствии с типом возвращаемого значения и знаком значения, если есть), и значение макроса ERANGE хранится в errno.

Теперь нам нужно снова посмотреть стандарт C ++.

21.5 Числовые преобразования [string.conversions]

  1. Броски: invalid_argument если strtol, strtoul, strtoll, или же strtoull сообщает, что нет конверсии
    может быть выполнено. Броски out_of_range если strtol, strtoul, strtoll или же strtoull наборы errno в
    ERANGEили если преобразованное значение находится за пределами диапазона представимых значений для возвращаемого типа.

Теперь вы можете понять, когда invalid_argument а также out_of_range надеюсь, исключение

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]