尝试以特定长度将字符串从一个字符串复制到另一个字符串时出现分段错误?
Segmentation Fault when trying to copy string from one to another at particular lengths?
#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'。 String 's' 作为输入,来自 user.The 代码片段输出字符串长度供参考,另外两行打印
's' 和 's_new'
的最后一个字符
但是对于特定的长度,此程序会在各种 IDE 中创建分段错误。
例如,我在 Ideone 中遇到长度为 25 的分段错误。同样在 onlineGDB 中,我遇到了长度 1961.These 的分段错误 IDE。
中的长度并不总是恒定的
我只为这些字符串使用了 lower_case 个字母字符,并且我为这些测试使用了随机生成的各种长度的字符串。
当我为同一个作业使用字符数组时,我没有收到任何错误。
我想知道这个问题是因为代码还是像我一样使用字符串 STL 时出现问题?
s_new[i]=s[i];
具有未定义的行为,因为
s_new.size() == 0
.
您需要调整它的大小才能完成您正在做的事情:
s_new.resize(len);
for(int i=0;i<len;i++){
s_new[i]=s[i];
}
for a particular length this program is creating segmentation fault in various IDE
越界写入总是有未定义的行为。在这种情况下,最有可能发生的情况是:
A std::string
经常使用 small string optimization,其中完整的字符串数据存储在 std::string
内部。对于较长的字符串,将使用指向字符串数据的指针(但 class 的用户不会注意到这一点)。当您执行 s_new[i] = ...
并且字符串长度为 0 并且您通过了小字符串优化阈值时,您开始覆盖 std::string
中的其他内部数据或存储在 std::string
之后的内存中的其他内容。
#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'。 String 's' 作为输入,来自 user.The 代码片段输出字符串长度供参考,另外两行打印 's' 和 's_new'
的最后一个字符但是对于特定的长度,此程序会在各种 IDE 中创建分段错误。 例如,我在 Ideone 中遇到长度为 25 的分段错误。同样在 onlineGDB 中,我遇到了长度 1961.These 的分段错误 IDE。
中的长度并不总是恒定的我只为这些字符串使用了 lower_case 个字母字符,并且我为这些测试使用了随机生成的各种长度的字符串。
当我为同一个作业使用字符数组时,我没有收到任何错误。
我想知道这个问题是因为代码还是像我一样使用字符串 STL 时出现问题?
s_new[i]=s[i];
具有未定义的行为,因为
s_new.size() == 0
.
您需要调整它的大小才能完成您正在做的事情:
s_new.resize(len);
for(int i=0;i<len;i++){
s_new[i]=s[i];
}
for a particular length this program is creating segmentation fault in various IDE
越界写入总是有未定义的行为。在这种情况下,最有可能发生的情况是:
A std::string
经常使用 small string optimization,其中完整的字符串数据存储在 std::string
内部。对于较长的字符串,将使用指向字符串数据的指针(但 class 的用户不会注意到这一点)。当您执行 s_new[i] = ...
并且字符串长度为 0 并且您通过了小字符串优化阈值时,您开始覆盖 std::string
中的其他内部数据或存储在 std::string
之后的内存中的其他内容。