字符串不变

时间:2018-12-08 13:03:56

标签: c++ string c++11

string a;
string seq="AACCGGTT";

for (int i=0;i<seq.length();i++)
{
    if (seq[i]=='T')
    {
        a[i]='U';
        cout<<"i have turned: "<<seq[i]<<" into : "<<a[i]<<endl;
    }
    else
    {
        a[i]=seq[i];
        cout<<"i have turned: "<<seq[i]<<" into : "<<a[i]<<endl;
    }
}

cout<<"here: "<<a<<endl;

**

  • 当我运行大代码的这一部分时,就会打印出

我已经将:A变成:A

我已经将:A变成:A

我已经将:C变成:C

我已经将:G变成:G

我已经将:G变成:G

我已经变成了:T变成:U

我已经变成了:T变成:U

此处:

并且不返回a的值

**

4 个答案:

答案 0 :(得分:3)

索引运算符[]不会对a附加任何内容,它只能使您访问a现有个字符。由于a中没有字符,因此[]a的每个用法都是未定义的行为

要向a实际添加内容,可以使用a.append('U');a += 'U';

一种替代方法是将a初始化为seq的副本,而不是空字符串。然后,您可以立即尝试在其上安全地使用索引运算符。

您可能还需要考虑here中所述的replace函数。

答案 1 :(得分:1)

在您的代码中a由以下默认构造函数创建。 例如,n3337(草稿)的21.4.2中的表63表示

explicit basic_string(const Allocator& a = Allocator());

data(): a non-null pointer that is copyable and can have 0 added to it
size(): 0
capacity(): an unspecified value

因此,您的代码中的a[i]可以显示一些未定义的行为。

我认为,替换特定字符的最简单方法是使用std::replace,如下所示。

DEMO

#include <iostream>
#include <string>
#include <algorithm>

int main()
{    
    std::string seq="AACCGGTT";
    std::replace(seq.begin(), seq.end(), 'T', 'U');

    std::cout << seq << std::endl; // "AACCGGUU"

    return 0;
}

答案 2 :(得分:0)

a+=seq[i]改为a [i] = seq [i](当然a + ='U'为) 问题是[i]不能成为原因的一部分a为空 在循环中设置a [i]时,a [i]表示编译器的不同变量。

答案 3 :(得分:0)

由于尚未设置字符串a的大小,因此它仅保留实现实现的小型字符串优化所提供的空间。 (但是请注意,即使这样,在初始化字符串之前索引到字符串也是未定义的行为。)

您可以通过设置a的大小来解决此问题,如下所示:

string seq="AACCGGTT";
string a;
a.resize(seq.size();