我有两个字符串变量,它们在某个点之后互相混合字母,我不知道为什么。
像这样从.txt文件中读取字符串dna1和dna2:
string opfile1(string& dnafile, string& dnaseq1); // function dec
string opfile2(string& dnafile, string& dnaseq2);
int main()
{
string dna1;
string dna2;
string seq1;
string seq2;
order1 = openSecondFile(dna1, seq1);
order2 = openThirdFile(dna2, seq2);
//function calls ^
string opfile1(string& dnafile, string& dnaseq1); // function dec
{
string PName;
string frag;
ifstream in_s;
in_s.open(dnafile.c_str());
if(in_s.fail()) //if file does not exist a fail message will appear
{
cout << "Unable to open input file " << song1File << endl;
exit(EXIT_FAILURE);
}
getline(in_s, frag, '|');
Name = frag.substr(1);
in_s >> dnaseq1;
in_s.clear();
return Name;
}
//功能定义
函数opfile2
完全相同,除了在任何地方看到“ 1”外,我都将其替换为“ 2”以匹配其变量。
现在,当我在主要功能中将它们打印出来时,它们看起来像这样:
cout << dnaseq1 << endl;
cout << dnaseq2 << endl;
输出:
FDFDAFDAF
DFDAFDATZY
哪个是正确的!现在,当我尝试使用for循环打印它们时,会发生这种情况:
int columns = dnaseq1Size + 1;
for(int i = 0; i < columns; ++i)
{
if(i == 0)
{
cout << setw(3) << "-" << " ";
}
else
{
cout << setw(3) << dnaseq2.at(i) << " ";
}
}
输出:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 9) >= this->size() (which is 9)
- D F D A F D A F Aborted (core dumped)
(它开始打印其他笔记)
我不知道发生了什么,有人可以帮忙吗?
编辑:我弄清楚了问题并解决了。我认为该问题与我使用数组和“大小”有关,因此我切换到2D向量并使用.size代替,此问题自行修复。
答案 0 :(得分:0)
很清楚。您的字符串的大小为9(例如FDFDAFDAF
),但是您尝试打印musicalnotes2.at(9)
。如果您的字符串的大小为9,那么只有0到8是合法索引
如评论中所述,可疑部分是您写信时
int columns = song2Size + 1;
for(int i = 0; i < columns; ++i)
...
为什么要在其中添加一个?这似乎是问题所在。
答案 1 :(得分:0)
听起来好像您正在尝试从musicalnotes
变量中打印出每个字符
能够做到这一点的一种方法是将其包装在一个函数中(便于重用)
void printNotes(const string &musicalNotes) {
cout << setw(3) << "-" << " ";
for(int i = 0; i < musicalNotes.length(); ++i)
{
cout << setw(3) << musicalNotes.at(i) << " ";
}
cout << endl;
}
int main()
{
//... code up until you wish to print it
printNotes(musicalnotes1);
printNotes(musicalnotes2);
//... if you want something afterward
return 0;
}
在这里,我们将int columns = song2Size + 1;
替换为字符串的长度,然后在从那里写入任何内容之前,我们先写出-
输出示例为:
- F D F D A F D A F
- D F D A F D A T Z Y
我假设song2Size
等于musicalnotes2.length()
,如果是这种情况,则您确实写了字符串长度,因此出现了超出范围的错误。如果它包含9个字符,则它将位于索引0,1...7,8
而不是9