当使用scanf()及其变体时,格式说明符%i将接受十六进制(前缀为"0x")、八进制(前缀为"0")或十进制(无前缀)形式的数据,例如,字符串"0x10“、"020”和" 16“都被转换为具有十进制值16的整数。
std::istream::operator>>格式的输入可以做到这一点吗?
使用不带i/o操纵器的普通>> i时,"0x10“将转换为零(或者更确切地说,前导0表示不处理"x10”部分),"020“将转换为20。hex、oct和dec操纵器的行为分别类似于%x、%o和%d。我正在寻找一个像%i一样工作的通用整数输入操纵器。
有趣的是,hex操纵器可能同时接受将"0x10“和"10”转换为16十进制。
如果您想知道,我正在实现一个表达式求值器,我希望使用C/C++前缀约定允许整数操作数为十六进制、八进制或十进制。当前使用sscanf()的实现使用%i自动完成此操作,我很好奇是否可以将其修改为使用iostream,而不必显式解析数字格式。
发布于 2010-12-18 15:16:40
basic_istream的格式标志中的基字段指示如何解释数字。该字段可以设置为dec、oct和hex。默认情况下,它被设置为dec。如果将其设置为none,basic_istream的行为将类似于scanf的%i标志:
// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);发布于 2018-08-03 20:04:52
一种稍微直观一点的解决方案是使用setbase(int base)操纵器,而不是直接重置基场:
#include <iomanip>
#include <iostream>
int main()
{
int i;
std::cin >> std::setbase(0) >> i;
std::cout << i << std::endl;
}引用cppreference的话:
基值不是8、10或16的
值会将基字段重置为零,这对应于十进制输出和前缀相关的输入。
https://stackoverflow.com/questions/4476804
复制相似问题