簡體   English   中英

將位域轉換為字符串C ++

[英]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 ++認為0char*指針,並將嘗試將其( 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::arraystd::vector ,它們具有方便的size()成員函數。 (但是要小心vector<bool> ,因為這是一種特殊情況,並不總是表現得像標准容器。)或者您可以使用std::bitset ,它具有方便的to_string函數,可以完全滿足您的要求。

最后,啟用編譯器的警告-它應該告訴您不要在您的意思是==地方使用= 而且,對於布爾值既不是真也不是假的情況,沒有太多的要點檢查。 您可以將整個循環體減少到

c_conv.append(b_input[i] ? '1' : '0');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM