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的值
**
答案 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
,如下所示。
#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();