首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`std::istream::operator>>()`可以接受像stdio的%i格式说明符这样的整数基数前缀吗?

问`std::istream::operator>>()`可以接受像stdio的%i格式说明符这样的整数基数前缀吗?
EN

Stack Overflow用户
提问于 2010-12-18 13:27:25
回答 2查看 1.3K关注 0票数 11

当使用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,而不必显式解析数字格式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-18 15:16:40

basic_istream的格式标志中的基字段指示如何解释数字。该字段可以设置为dec、oct和hex。默认情况下,它被设置为dec。如果将其设置为none,basic_istream的行为将类似于scanf的%i标志:

代码语言:javascript
复制
// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);
票数 11
EN

Stack Overflow用户

发布于 2018-08-03 20:04:52

一种稍微直观一点的解决方案是使用setbase(int base)操纵器,而不是直接重置基场:

代码语言:javascript
复制
#include <iomanip>
#include <iostream>

int main()
{
  int i;
  std::cin >> std::setbase(0) >> i;
  std::cout << i << std::endl;
}

引用cppreference的话:

基值不是8、10或16的

值会将基字段重置为零,这对应于十进制输出和前缀相关的输入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4476804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档