如何解决将 char 转换为 std::string c++ 时的未定义行为
我的程序接受一个向量 std::vector<std::string> vector
和一个字符 char separator
并返回一个字符串,其中所有字符串在分隔符之间加在一起。概念是:vector[0] + separator + vector[1] + separator
代码
std::string VectorToString(std::vector<std::string> vector,char separator)
{
std::string output;
for(std::string segment : vector)
{
std::string separator_string(&separator);
output += segment + separator_string;
}
return output;
}
int main()
{
std::vector<std::string> vector = {"Hello","my","beautiful","people"};
std::cout << VectorToString(vector,' ');
}
我的预期输出是 Hello my beautiful people
但是输出是:
Hello �����my �����beautiful �����people �����
我发现这个字符有问题,特别是它的指针:std::cout << &separator;
-> �ƚ��
。但是,如果我喜欢这样:std::cout << (void*) &separator;
-> 0x7ffee16d35f7
。虽然我真的不知道 (void*)
是做什么的。
问题:
1.发生了什么?
2.为什么会这样?
3.我该如何解决?
4.如何防止在以后的项目中发生这种情况?
解决方法
这一行
std::string separator_string(&separator);
尝试从以 0 结尾的 C 字符串构造一个字符串。
但是 &separator
不是以 0 结尾的,因为它取决于 separator
之后的其他内存字节,如果其中有 0 字节(可能没有)。所以你得到了未定义的行为。
你可以做的是使用其他构造函数:
std::string separator_string(1,separator);
这个通过重复 separator
字符 1 次来创建一个字符串。
按照标准,如下:
basic_string( const CharT* s,const Allocator& alloc = Allocator() );
意思是:
用 s 指向的 空终止 字符串的副本初始化内容来构造字符串。字符串的长度由第一个空字符决定。如果 [s,s + Traits::length(s)) 不是有效范围,则行为未定义。
因此,std::string separator_string(&separator);
会导致未定义行为,因为 separator
不是以 null 结尾的。
为了防止这种情况,您可能需要使用以下重载:
basic_string( const CharT* s,size_type count,const Allocator& alloc = Allocator() );
像 std::string separator_string(&separator,1);
或更简单的(如其他答案指出的那样)std::string separator_string(1,separator);
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。