[英]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.