将位域转换为字符串 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++ 新手。
您的代码中有 很多 错误。
首先,空指针异常来自于bitfieldToString
函数末尾的return (0);
。您已将其定义为 return a string
;当您改为 return 0
时,C++ 认为 0
是一个 char*
指针,并会尝试将其 - 一个 NULL
指针 - 转换为一个字符串,这将导致崩溃。您可能应该 returning c_conv
而不是。
其次,sizeof(b_input)
将始终是 bool
指针的大小。在 32 位系统上它将是 4,在 64 位系统上它将是 8。您不能通过 sizeof
获得作为参数传递的数组的长度;您需要为您的函数添加一个长度参数。
第三,在您的 for 循环中,您将 分配 给 b_input[i]
而不是比较值。使用 ==
,而不是 =
。
第四,在最后一个 else
分支中,您缺少大括号。本质上,break
总是会在第一次迭代后跳出循环。
例外是因为你return (0);
。这被解释为空指针,用于使用构造函数初始化 std::string
,该构造函数需要指向 C 样式字符串的有效指针 - 而不是空指针。
应该是return c_conv;
大小不匹配是因为 b_input
不是数组。作为函数参数,bool b_input[]
是一个指针。您不能按值将数组传递给函数;并且无法仅从指针确定数组大小。所以 sizeof(b_input)
给你的是指针的大小,而不是数组,一切都出错了。
有几个选项。您可以将大小作为第二个参数传递;但那很容易出错。您可以通过引用数组来推断大小作为模板参数:
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');
我想将位域转换为字符串。 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++ 新手。
您的代码中有 很多 错误。
首先,空指针异常来自于bitfieldToString
函数末尾的return (0);
。您已将其定义为 return a string
;当您改为 return 0
时,C++ 认为 0
是一个 char*
指针,并会尝试将其 - 一个 NULL
指针 - 转换为一个字符串,这将导致崩溃。您可能应该 returning c_conv
而不是。
其次,sizeof(b_input)
将始终是 bool
指针的大小。在 32 位系统上它将是 4,在 64 位系统上它将是 8。您不能通过 sizeof
获得作为参数传递的数组的长度;您需要为您的函数添加一个长度参数。
第三,在您的 for 循环中,您将 分配 给 b_input[i]
而不是比较值。使用 ==
,而不是 =
。
第四,在最后一个 else
分支中,您缺少大括号。本质上,break
总是会在第一次迭代后跳出循环。
例外是因为你return (0);
。这被解释为空指针,用于使用构造函数初始化 std::string
,该构造函数需要指向 C 样式字符串的有效指针 - 而不是空指针。
应该是return c_conv;
大小不匹配是因为 b_input
不是数组。作为函数参数,bool b_input[]
是一个指针。您不能按值将数组传递给函数;并且无法仅从指针确定数组大小。所以 sizeof(b_input)
给你的是指针的大小,而不是数组,一切都出错了。
有几个选项。您可以将大小作为第二个参数传递;但那很容易出错。您可以通过引用数组来推断大小作为模板参数:
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');