独立的事物相互影响(我不知道发生了什么)
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"中有单词。最后的程序应该只将它们写入向量并将向量中的内容写入标准输出。问题是:
- 然而第(1)行证明所有单词都可以
- 矢量似乎是
第 (2) 行为空
现在很有趣(可能只适合我)部分:
有两种正确的方法:
- 我可以删除第(3)行(但是,如果我是对的,因为变量通过值传递给排序函数,它只是交换自变量中的两个字母;它与我的向量无关), 或:
- 我可以在 while 循环 (4) 中更改条件。
例如像这样:
int tmp = 0;
while (tmp < 5){
tmp++;
/..../
这段代码有什么问题?我应该如何将这些词写成向量但仍然对它们进行排序并使用这个 while 循环?我找不到这些东西之间的联系(好的,我看到联系是可变词,但我不知道是什么方式)。任何帮助表示赞赏。
如果其中一个词是空字符串 ""
,swap()
中会发生什么?
- 如果发生这种情况,
litery = ""
。
- 循环中的条件将从
0
迭代到 (unsigned) 0 - 1
,这是一个非常大的数字。
- 然后您将执行
if (litery[0] > litery[1])
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;
}
对不起标题,但我真的不知道问题出在哪里。代码看起来是这样的(这里没有意义,但是在更大的项目中是有的,所以请不要问"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"中有单词。最后的程序应该只将它们写入向量并将向量中的内容写入标准输出。问题是:
- 然而第(1)行证明所有单词都可以
- 矢量似乎是 第 (2) 行为空
现在很有趣(可能只适合我)部分:
有两种正确的方法:
- 我可以删除第(3)行(但是,如果我是对的,因为变量通过值传递给排序函数,它只是交换自变量中的两个字母;它与我的向量无关), 或:
- 我可以在 while 循环 (4) 中更改条件。
例如像这样:
int tmp = 0;
while (tmp < 5){
tmp++;
/..../
这段代码有什么问题?我应该如何将这些词写成向量但仍然对它们进行排序并使用这个 while 循环?我找不到这些东西之间的联系(好的,我看到联系是可变词,但我不知道是什么方式)。任何帮助表示赞赏。
如果其中一个词是空字符串 ""
,swap()
中会发生什么?
- 如果发生这种情况,
litery = ""
。 - 循环中的条件将从
0
迭代到(unsigned) 0 - 1
,这是一个非常大的数字。 - 然后您将执行
if (litery[0] > litery[1])
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;
}