[英]convert bitfield to string C++
我想將位域轉換為字符串。 Visual Studio 2008提供了無效的空指針異常。
也許與數組的大小有關。 必須為8,但輸出顯示為4,但是為什么呢?
class Converter
{
public:
string bitfieldToString (bool b_input[])
{
string c_conv;
int i;
for(i = 0; i < sizeof(b_input) ; i++)
{
if(b_input[i]=false){
c_conv.append("0");
}
else if (b_input[i]=true){
c_conv.append("1");
}
else c_conv = "Input is not a bitfield";break;
}
cout<<c_conv<<" "<< sizeof(b_input)<<endl;
return (0);
}
};
int main(void)
{
Converter converter;
bool b2[8] = {0,1,0,0,1,0,1,1};
converter.bitfieldToString(b2);
return (0);
}
謝謝! 現在一切都按預期進行。 對這個轉儲問題深表歉意。 我是C ++的新手。
您的代碼有很多錯誤。
首先,空指針異常來自return (0);
在bitfieldToString
函數的末尾。 您已定義它以返回string
; 當您return 0
,C ++認為0
是char*
指針,並將嘗試將其( NULL
指針)轉換為字符串,這將導致崩潰。 您可能應該返回c_conv
。
其次, sizeof(b_input)
將始終是bool
指針的大小。 在32位的系統將是如圖4所示,在64位系統8上不能獲得與通過參數傳遞的數組的長度sizeof
; 您將需要在函數中添加一個length參數。
第三,在for循環中,您將分配給b_input[i]
而不是比較這些值。 使用==
,而不是=
。
第四,在最后一個else
分支中,您缺少花括號。 本質上, break
將在第一次迭代后始終跳出循環。
例外是因為您return (0);
。 這被解釋為空指針,用於通過構造函數初始化std::string
,該構造函數需要指向C樣式字符串的有效指針-而不是空指針。
那應該是return c_conv;
大小不匹配是因為b_input
不是數組。 作為函數參數, bool b_input[]
是一個指針。 您不能按值將數組傳遞給函數; 而且沒有辦法僅通過指針來確定數組大小。 所以sizeof(b_input)
給你一個指針的大小,而不是數組的大小,一切都會出錯。
有一些選擇。 您可以將size作為第二個參數傳遞; 但這容易出錯。 您可以通過引用引用數組來推斷大小為模板參數:
template <size_t size>
string bitfieldToString (bool (&b_input)[size])
您可以使用std::array
或std::vector
,它們具有方便的size()
成員函數。 (但是要小心vector<bool>
,因為這是一種特殊情況,並不總是表現得像標准容器。)或者您可以使用std::bitset
,它具有方便的to_string
函數,可以完全滿足您的要求。
最后,啟用編譯器的警告-它應該告訴您不要在您的意思是==
地方使用=
。 而且,對於布爾值既不是真也不是假的情況,沒有太多的要點檢查。 您可以將整個循環體減少到
c_conv.append(b_input[i] ? '1' : '0');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.