Спецификация для strtol
концептуально делит входную строку на «начальный пробел», «предметную последовательность» и «конечную строку» и определяет «предметную последовательность» как:
самая длинная начальная подпоследовательность входной строки, начиная с первого символа, не являющегося пробелом, в ожидаемой форме. Субъектная последовательность не должна содержать символов, если входная строка пуста или состоит полностью из символов пробела, или если первый символ, не являющийся пробелом, отличается от знака или допустимой буквы или цифры.
Когда-то я думал, что бизнес "самая длинная начальная подпоследовательность" сродни тому, как работает scanf
, где "0x@"
будет сканировать как "0x"
, неудачное совпадение, а затем "@"
как следующий непрочитанный символ , Однако после некоторого обсуждения я в основном убежден, что strtol
обрабатывает самую длинную начальную подпоследовательность ожидаемой формы, а не самую длинную начальную строку, которая является начальной подпоследовательностью некоторой возможной строки ожидаемой формы.
Что меня все еще смущает, так это язык в спецификации:
Если подчиненная последовательность пуста или не имеет ожидаемой формы, преобразование не выполняется; значение str хранится в объекте, на который указывает endptr, при условии, что endptr не является нулевым указателем.
Если мы примем то, что кажется правильным определением «предметной последовательности», не существует такой вещи, как непустая предметная последовательность, которая не имеет ожидаемой формы, и вместо этого (чтобы избежать избыточности и путаницы) текст следует просто прочитать:
Если предметная последовательность пуста, преобразование не выполняется; значение str хранится в объекте, на который указывает endptr, при условии, что endptr не является нулевым указателем.
Может кто-нибудь прояснить мне эти вопросы? Возможно, будет полезна ссылка на прошлые обсуждения или любые соответствующие сообщения о дефектах.