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

时间:2010-12-18 05:27:25

标签: c++ scanf istream iomanip

当使用scanf()及其变体时,格式说明符%i将接受数据为十六进制(前缀“0x”),八进制(前缀“0”)或十进制(无前缀),例如字符串“0x10”,“020”和“16”都转换为十进制值为16的整数。

可以使用std::istream::operator>>格式化输入来完成吗?

使用没有i / o操纵器的普通>> i“0x10”被转换为零(或者更确切地说,前导0是,“x10”部分未被处理),并且“020”被转换为20. { {1}},hexoct操纵符的行为分别类似于dec%x%o。我正在寻找一个像%d一样工作的通用整数输入操纵器。

有趣的是,%i操纵器可能同时接受“0x10”和“10”转换为16位十进制。

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

2 个答案:

答案 0 :(得分:10)

basic_istream格式标志中的基本字段决定了如何解释数字。该字段可以设置为decocthex。默认情况下,它设置为dec。如果它们都没有设置,basic_istream的行为就像scanf的{​​{1}}标志:

%i

答案 1 :(得分:1)

与其直接重置基场,不如说更直观 解决方案是使用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以外的基数值会将基字段重置为零,这对应于十进制输出和与前缀相关的输入。