可以`std :: istream :: operator >>()`接受整数基数前缀,比如stdio的%i格式说明符吗?

Cli*_*ord 10 c++ scanf istream iomanip

当使用的scanf()和它的变体,该格式说明%i将接受作为十六进制数据(加前缀"0x"为),八进制(前缀"0"),或十进制(无前缀),因此,例如字符串"0x10的","020 "和"16"都转换为十进制值为16的整数.

这可以通过std::istream::operator>>格式化输入完成吗?

使用普通的>> i无I/O操纵器"为0x10"被转换成零(或者更确切地说,前导0,则"×10"的部分不被处理),以及"020",以20 hex,octdec操纵行为像%x,%o%d分别.我正在寻找一个像%i.一样的通用整数输入操纵器.

有趣的是,hex操纵器可能同时接受"0x10"和"10"转换为16位小数.

如果您可能想知道,我正在实现一个表达式求值程序,并且我希望使用C/C++前缀约定允许整数操作数为十六进制,八进制或十进制.当前使用的实现sscanf()会自动使用%i,我很好奇是否可以修改它以使用iostream而无需显式解析数字格式.

Joh*_*itb 10

格式标志中的基本字段basic_istream指示如何解释数字.该字段可以设置为dec,octhex.默认情况下,它设置为dec.如果它被设置为没有人,basic_istream会像scanf%i标志:

// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);
Run Code Online (Sandbox Code Playgroud)