![](/img/trans.png)
[英]How to use setfill and setw to stock an hex value in a string variable
[英]hex << setw() << setfill() doesn't work with pointer value output
Win7-64
cygwin的
Netbeans 7.4
gcc(cygwin)4.8.3
編譯器調用
g++ -Wall -Wno-reorder -Wno-unused-value -c -g -MMD -MP -MF
任何原因輸出和預期輸出不同? 我沒想到“ 0x”前綴。
Output << SlipHashEntry::create 0x22a000 list3
Expected << SlipHashEntry::create 0x000000000022a000 list3
Output << SlipDescription::delete 0x600062d50 list5
Expected << SlipDescription::delete 0x0000000600062d50 list5
這是相關的代碼片段
SlipHashEntry::SlipHashEntry
( const string& name, void* ptr, Type type, int debugFlag )
: completeFlag(false)
, debugFlag(debugFlag)
, hashDebugFlag((bool)(debugFlag & SlipRead::HASH))
, inputDebugFlag((bool)(debugFlag & SlipRead::INPUT))
, leakDebugFlag((bool)(debugFlag & SlipRead::LEAK))
, descriptorChain(NULL)
, link(NULL)
, name(new string(name))
, nestedPtr(NULL)
, ptr(ptr)
, type(type) {
DEBUG(leakDebugFlag,
cout << left << setw(27) << setfill(' ') << "SlipHashEntry::create "
<< hex << setw(sizeof(void*))
<< setfill('0') << (void*)this << ' ' << name <<endl;)
};
“輸出與預期輸出不同的任何原因?我沒想到前綴“ 0x”。”
關於輸出中的0x
前綴,這是由std::ostream& operator<<(std::ostream&, const void*)
的內部運算符重載完成的, std::ostream& operator<<(std::ostream&, const void*)
參見(7)
另外,您對setw()
有一些誤解:您應該記住, setw()
設置以字符(即數字)表示的字段大小。 您要顯示一個64位指針,該指針等效於8個字節,每個位數代表2位
cout << left << setw(27) << setfill(' ') << "SlipHashEntry::create "
<< hex << setw(2 * sizeof(void*))
// ^^^
<< setfill('0') << (void*)this << ' ' << name <<endl;)
只需將指針大小(以字節為單位)乘以2,即可獲得完整位數的正確字段寬度。
盡管void*
的內在輸出運算符定義不能完全滿足您的要求。
當我嘗試根據上面的說明制作在線可編譯示例時,我注意到您實際上無法操縱內部指針輸出格式。 我組成了一個簡單的示例,如何實現所需的固定8字節格式:
#include <iostream>
#include <iomanip>
// A simple manipulator to format pointers in a fixed length format (according
// 64 bit) with leading zeroes and a "0x" prefix
class fmt_longptr {
public:
fmt_longptr(void* ptr) : ptr_(ptr) {}
void put(std::ostream& os) const {
os << "0x" << std::hex << std::setw(2 * sizeof(void*))
<< std::setfill('0') << (unsigned long)ptr_;
}
private:
friend std::ostream& operator<<(std::ostream& os, const fmt_longptr& fmt);
void* ptr_;
};
std::ostream& operator<<(std::ostream& os, const fmt_longptr& fmt) {
fmt.put(os);
return os;
}
這是使用方法,並顯示了與固有指針格式的區別
int main() {
int a;
std::cout << std::setfill('0') << std::setw(2 * sizeof(void*)) << &a
<< std::endl;
std::cout << fmt_longptr(&a) << std::endl;
return 0;
}
產量
000x7fff270d987c
0x00007fff270d987c
這是在線工作示例 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.