当使用scanf()及其变体时,格式说明符%i
将接受数据为十六进制(前缀“0x”),八进制(前缀“0”)或十进制(无前缀),例如字符串“0x10”,“020”和“16”都转换为十进制值为16的整数。
可以使用std::istream::operator>>
格式化输入来完成吗?
使用没有i / o操纵器的普通>> i
“0x10”被转换为零(或者更确切地说,前导0是,“x10”部分未被处理),并且“020”被转换为20. { {1}},hex
和oct
操纵符的行为分别类似于dec
,%x
和%o
。我正在寻找一个像%d
一样工作的通用整数输入操纵器。
有趣的是,%i
操纵器可能同时接受“0x10”和“10”转换为16位十进制。
如果您可能想知道,我正在实现一个表达式求值程序,并且我希望使用C / C ++前缀约定允许整数操作数为十六进制,八进制或十进制。使用hex
的当前实现使用sscanf()
自动执行此操作,我很好奇是否可以将其修改为使用iostream而无需显式解析数字格式。
答案 0 :(得分:10)
basic_istream
格式标志中的基本字段决定了如何解释数字。该字段可以设置为dec
,oct
和hex
。默认情况下,它设置为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以外的基数值会将基字段重置为零,这对应于十进制输出和与前缀相关的输入。