当使用scanf()及其变体时,格式说明符%i可以接受十六进制(前缀为"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/C++前缀约定表示为十六进制、八进制或十进制。当前使用sscanf()实现自动使用%i来完成这个功能,我很好奇是否可以修改为使用iostream而不必显式解析数字格式。
那么,使用std::istream::operator>>格式化输入是否也可以实现这一点呢?
使用普通的>> i输入操作符而没有I/O操作符时,“0x10”将被转换为零(或者更准确地说,前导0将被剔除,"x10"部分不会被处理),而“020”则会被转换为20。hex、oct和dec操作符分别像%x、%o和%d一样工作。我正在寻找一个通用的整数输入操作符,它的行为类似于%i。
可能有趣的是,hex操作符接受"0x10"和"10"两种形式,将任一形式都转换为十进制数16。
如果你想知道,我正在实现一个表达式求值器,并且我希望允许的整数操作数可以使用C/C++前缀约定表示为十六进制、八进制或十进制。当前使用sscanf()实现自动使用%i来完成这个功能,我很好奇是否可以修改为使用iostream而不必显式解析数字格式。
std::ios_base& integer( std::ios_base& str );
。 - Clifford