如何解决为什么使用字符串会导致退出代码3而使用char []没有
我正在练习我的编码技能,并且正在解决以下backtracking problem(也有原始指南的解决方案)。
问题摘要:
给出一个字符串,您需要打印所有可能的字符串,只要在它们之间放置空格(零或一)即可。
我的解决方法是:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
void permutationWithSpacesAux(const char* s,string buf,int s_index,int b_index,int len_s){
// stop condition
if(s_index == len_s){
cout << buf << endl;
return;
}
// print w\o space
buf[b_index] = s[s_index];
// recursive call w\ next indices
permutationWithSpacesAux(s,buf,s_index + 1,b_index + 1,len_s);
// print w\ space
buf[b_index] = ' ';
buf[b_index + 1] = s[s_index];
// recursive call w\ next indices
permutationWithSpacesAux(s,b_index + 2,len_s);
}
void permutationWithSpaces(const char* s){
int n = strlen(s);
string buf;
buf.reserve(2*n);
buf[0] = s[0];
permutationWithSpacesAux(s,1,n);
}
int main() {
const char* s = "ABCD";
permutationWithSpaces(s);
return 0;
}
这是我得到的错误:
C:\Users\elino\CLionProjects\permutationWithSpaces\cmake-build-debug\permutationWithSpaces.exe
/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic_string.h:1067: std::__cx
x11::basic_string<_CharT,_Traits,_Alloc>::reference std::__cxx11::basic_string<_CharT,_Alloc>::operator[](st
d::__cxx11::basic_string<_CharT,_Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Al
loc = std::allocator<char>; std::__cxx11::basic_string<_CharT,_Alloc>::reference = char&; std::__cxx11::basic_
string<_CharT,_Alloc>::size_type = unsigned int]: Assertion '__pos <= size()' failed.
Process finished with exit code 3
我的解决方案与指南的解决方案非常相似,只是我将std::string
用作缓冲区变量,而不是指南中的char[]
。
我试图了解std::string
类的哪些属性可能会引起此问题。根据我在网上发现的信息,我认为尝试访问字符串字符时访问了内存中的非法位置,并且我认为问题出在我为buf
保留内存中空间的方式上。
我想对这个问题有更深入的了解,如果有人可以进一步解释问题的根源,我将不胜感激。
解决方法
std::string::reserve()
并没有达到您的预期效果,即不会增加字符串的实际大小。
改为使用std::string::resize()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。