我的变量相互混合值吗??? C ++

时间:2019-07-14 16:22:00

标签: c++ string for-loop

我有两个字符串变量,它们在某个点之后互相混合字母,我不知道为什么。

像这样从.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代替,此问题自行修复。

2 个答案:

答案 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