找不到在线帮助。有什么办法可以解决此问题?std::showbase
仅为非零数字(如here所述)添加前缀(例如0x
时为std::hex
)。我想要使用0x0
而不是0
格式化的输出。
但是,仅使用:std::cout << std::hex << "0x" << ....
是不可行的,因为右侧参数可能并不总是整数(或等效值)。我正在寻找一个showbase替代品,该替代品将用0x
前缀0,并且不会扭曲非整数(或等效形式),如下所示:
using namespace std;
/* Desired result: */
cout << showbase << hex << "here is 20 in hex: " << 20 << endl; // here is 20 in hex: 0x14
/* Undesired result: */
cout << hex << "0x" << "here is 20 in hex: " << 20 << endl; // 0xhere is 20 in hex: 20
/* Undesired result: */
cout << showbase << hex << "here is 0 in hex: " << 0 << endl; // here is 0 in hex: 0
多谢。
最佳答案
尝试
std::cout << "here is 20 in hex: " << "0x" << std::noshowbase << std::hex << 20 << std::endl;
这样,数字始终始终以
0x
为前缀,但是您必须在每个打印的数字之前添加<< "0x"
。您甚至可以尝试创建自己的流操纵器
struct HexWithZeroTag { } hexwithzero;
inline ostream& operator<<(ostream& out, const HexWithZeroTag&)
{
return out << "0x" << std::noshowbase << std::hex;
}
// usage:
cout << hexwithzero << 20;
要保持
operator<<
调用之间的设置,请使用here中的answer扩展自己的流。您必须像这样更改语言环境的do_put
:const std::ios_base::fmtflags reqFlags = (std::ios_base::showbase | std::ios_base::hex);
iter_type
do_put(iter_type s, ios_base& f, char_type fill, long v) const {
if (v == 0 && ((f.flags() & reqFlags) == reqFlags)) {
*(s++) = '0';
*(s++) = 'x';
}
return num_put<char>::do_put(s, f, fill, v);
}
完整的工作解决方案:http://ideone.com/VGclTi
关于c++ - 解决std::showbase不加零前缀的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32226884/