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

时间:2015-01-25 20:41:48

标签: c++ vector fstream

对不起标题,但我真的不知道问题是什么。代码看起来像那样(这里没有意义,但是在更大的项目中有,所以请不要问"你为什么要这样做......")

#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)
  }

}

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

  • 然而第(1)行证明所有单词都没问题
  • 矢量似乎是 排成一行(2)

现在迭代(可能仅适合我)部分:

有两种方法可以做到:

  • 我可以删除第(3)行(但是,如果我是对的,因为变量通过值传递给sort函数,它只是在自变量中交换两个字母;它与我的向量无关),或者:
  • 我可以在while循环(4)中更改条件。

就像这样:

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

这段代码有什么问题?我应该怎么做才能将这些单词写入vector但仍然对它们进行排序并使用while while循环?我找不到这些东西之间的联系(好吧,我看到那个连接是变量字,但我不知道以什么方式)。任何帮助欣赏。

1 个答案:

答案 0 :(得分:3)

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

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

    常见的解决方法是从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;
    }