c++ - 尝试以特定长度将字符串从一个复制到另一个时出现段错误?

标签 c++ string segmentation-fault

#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' 和 's_new' 的最后一个字符
但是对于特定长度,该程序会在各种 IDE 中创建段错误。
例如,我在 Ideone 中遇到长度为 25 的段错误。同样在 onlineGDB 中,我得到长度为 1961 的段错误。这些长度在这些 IDE 中并不总是恒定的。
我只对这些字符串使用了小写字母字符,并且我为这些测试使用了随机生成的各种长度的字符串。
当我将字符数组用于同一作业时,我没有收到任何错误。
我想知道这个问题是因为代码还是像我一样使用字符串 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


越界写入总是具有未定义的行为。在这种情况下,发生的情况很可能是这样的:
一个 std::string经常使用small string optimization其中完整的字符串数据内部存储在 std::string .对于较长的字符串,将使用指向字符串数据的指针(但该类的用户不会注意到这一点)。当你这样做 s_new[i] = ...并且字符串长度为 0 并且您通过了小字符串优化阈值,您开始覆盖 std::string 中的其他内部数据或存储在 std::string 之后的内存中的其他内容.

关于c++ - 尝试以特定长度将字符串从一个复制到另一个时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63011557/

相关文章:

linux - 使用另一个文件的行号从文本文件中删除行

c - 使用 char 指针 -> 段错误

c++ - 写入文件时核心转储?

c++ - Qt 的调试器是否适用于段错误?

c++ - 在类中使用指针时遇到问题

c++ - LNK2001 : Unresolved external symbol when using qwt plot in Qt creator

c++ - '.expression'的左侧必须具有class/struct/union

c - 为什么这不适用于 c 中的 printf()

c++ - 如何创建一个类来接受包含任何类型数据的 vector ?

c++ - 检查字符串的格式是否为 "coordinate/coordinate"