独立的事物相互影响(我不知道发生了什么)

independent things influence each other (I have no idea what is going on)

对不起标题,但我真的不知道问题出在哪里。代码看起来是这样的(这里没有意义,但是在更大的项目中是有的,所以请不要问"why do you want to do....")

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

string sort (string slowo){
  string litery = slowo;

  for (int i=0; i<litery.length()-1; i++)
     for (int j=0; j<litery.length()-1; j++)
        if (litery[j]>litery[j+1])
             swap(litery[j], litery[j+1]); // (3)

  return litery;
}

int main()
{

    fstream wordlist;
    wordlist.open("wordlist_test",ios::in);
    vector<string> words;

    while (!wordlist.eof()){ // (4)
      bool ok = true;
      string word;
      getline(wordlist,word);
      string sorted = sort(word);

      if (ok){
        cout<<word<<endl; // (1)
        words.push_back(word);
     }
  }

  for (int i = 0; i<words.size(); i++){
    cout<<words[i]<<endl; // (2)
  }

}

文件"wordlist_tests"中有单词。最后的程序应该只将它们写入向量并将向量中的内容写入标准输出。问题是:

现在很有趣(可能只适合我)部分:

有两种正确的方法:

例如像这样:

int tmp = 0;
while (tmp < 5){
tmp++;
/..../

这段代码有什么问题?我应该如何将这些词写成向量但仍然对它们进行排序并使用这个 while 循环?我找不到这些东西之间的联系(好的,我看到联系是可变词,但我不知道是什么方式)。任何帮助表示赞赏。

如果其中一个词是空字符串 ""swap() 中会发生什么?

  1. 如果发生这种情况,litery = ""
  2. 循环中的条件将从 0 迭代到 (unsigned) 0 - 1,这是一个非常大的数字。
  3. 然后您将执行 if (litery[0] > litery[1])
  4. litery[1] 将访问超出空字符串的末尾,这会导致未定义的行为。

让我们解决这个问题:

对此的常见修复是从 1 迭代到 string.length()。这是一个例子:

string sort (string litery){
    for (int i=1; i<litery.length(); i++)
        for (int j=1; j<litery.length(); j++)
            if (litery[j-1]>litery[j])
                swap(litery[j-1], litery[j]); 

    return litery;
}