我尝试创建一个读取文件并要求输入单词的程序。然后输出文件中使用的次数。
这是它正在阅读的文件中的内容:
此文件包含许多单词。很多很多的话。 好吧,也许它毕竟不是那么多。 那么,有多少人呢?
Word出现次数:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
using namespace std;
string RemovePunct(string word) {
char exc = '!';
char comma = ',';
char period = '.';
char question = '?';
for (int i = 0; i < word.length(); i++) {
if (word[i] == exc) {
word.pop_back();
}
else if (word[i] == comma) {
word.pop_back();
}
else if (word[i] == period) {
word.pop_back();
}
else if (word[i] == question) {
word.pop_back();
}
}
return word;
}
string ToLowercase(string word) {
transform(word.begin(), word.end(), word.begin(), tolower);
return word;
}
int main() {
string wo;
cin >> wo;
transform(wo.begin(), wo.end(), wo.begin(), tolower);
ifstream in("words.txt");
int wordcount = 0;
string word;
while (in >> word) {
RemovePunct(word);
ToLowercase(word);
cout << word << endl; // used to check if 'word' has changed
if (word == wo) {
++wordcount;
}
}
cout << wordcount << endl;
// outputs 4
// should output 6
}
正如你所看到的那样,它并不能解释每一个人的问题。在文件中。我尝试使用标点符号并将字符设置为小写,以便考虑每个&#39;许多&#39;但改变后的单词不会返回我的主要功能。所以,我正在寻找可能出错的地方的帮助。
答案 0 :(得分:2)
您的代码中有一个很小的重要错误。 您是通过值将字符串传递给RemovePunct和ToLowercase方法,而不是通过引用传递,因此您要更改字符串的副本,而不是字符串本身。
您应该按如下方式更改方法定义:
void ToLowercase(string & word) {
和
void RemovePunct(string & word) {
详细了解{{3}}
<强>编辑:强>
由于您现在通过引用将字符串作为输入/输出变量传递,因此从方法返回任何值也没有意义,因此返回类型现在为void,您应该省略return word;
从这两种方法。
答案 1 :(得分:0)
您的函数RemovePunct
和ToLowercase
返回修改后的字符串,但您永远不会接受它。
您可以将循环内的代码更改为
word = RemovePunct(word);
word = ToLowercase(word);
或将功能设为:
void RemovePunct (std::string& wo );
和
void ToLowercase (std::string& wo);
然后删除两个函数中的return语句,正如另一个答案所说的那样。