Может ли `std:: istream:: operator >>()` принимать целые префиксы radix, такие как stdio% я спецификатор формата?
При использовании scanf() и его вариантов спецификатор формата %i
будет принимать данные как hex (префикс "0x" ), восьмеричный (префикс "0" ) или десятичный (без префикса), так что, например, строки "0x10" , "020" и "16" преобразуются в целое число с десятичным значением 16.
Можно ли это сделать с помощью отформатированного ввода std::istream::operator>>
?
Использование простой >> i
без манипулятора i/o "0x10" преобразуется в ноль (или, скорее, в начале 0, часть "x10" не обрабатывается) и "020" - 20. hex
, oct
и dec
действуют как %x
, %o
и %d
соответственно. Я ищу общий целочисленный манипулятор ввода, который работает как %i
.
Интересно, что манипулятор hex
принимает как "0x10" , так и "10", конвертируя либо в 16 десятичных знаков.
В случае, если вам может быть интересно, я выполняю оценку выражения, и я хотел бы разрешить целочисленным операндам быть шестнадцатеричным, восьмеричным или десятичным с использованием соглашения о префиксах C/С++. Текущая реализация с использованием sscanf()
делает это автоматически с помощью %i
, и мне любопытно, можно ли это изменить для использования iostream без явного анализа числового формата.
Ответы
Ответ 1
Базовое поле в флагах формата basic_istream
диктует, как интерпретировать числа. Поле может быть установлено на dec
, oct
и hex
. По умолчанию он установлен на dec
. Если он не установлен ни в одном из них, basic_istream
будет вести себя как scanf
%i
флаг:
// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);