繁体   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