尝试以特定长度将字符串从一个字符串复制到另一个字符串时出现分段故障


#include <iostream>
using namespace std;
int main() {
string s,s_new;
cin>>s;
int len=s.length();
cout<<len<<"n";
for(int i=0;i<len;i++){
s_new[i]=s[i];
}
cout<<s[len-1]<<"n";
cout<<s_new[len-1];
return 0;
} 

我正试图将字符串's'复制到另一个字符串's_new'。字符串"s"被作为来自用户的输入。代码段输出字符串长度以供参考,另外两行打印"s"one_answers"s_new"中的最后一个字符

但对于特定的长度,这个程序在各种IDE中都会产生分段错误。例如,我在Ideone中得到了长度为25的分段错误。同样在onlineGDB中,我得到了长度为1961的分段错误。在这些IDE中,这些长度并不总是恒定的。

我只为这些字符串使用小写字母字符,并且在这些测试中使用了随机生成的各种长度的字符串。

当我在同一个作业中使用字符数组时,我没有收到任何错误。

我想知道这个问题是因为代码还是像我一样使用字符串STL有问题?

s_new[i]=s[i];自CCD_ 2。

你需要调整它的大小来做你正在做的事情:

s_new.resize(len);
for(int i=0;i<len;i++){
s_new[i]=s[i];
}

对于特定长度,该程序在各种IDE 中创建分段故障

写越界总是有未定义的行为。在这种情况下,最有可能发生的情况是:

std::string通常使用小字符串优化,其中完整的字符串数据存储在std::string内部。对于较长的字符串,将使用指向字符串数据的指针(但类的用户不会注意到这一点(。当您执行s_new[i] = ...并且字符串长度为0并且您通过了小字符串优化阈值时,您开始覆盖std::string中的其他内部数据或std::string之后存储的内存中的其他数据。

相关内容

  • 没有找到相关文章

最新更新