#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
之后存储的内存中的其他数据。