如何从函数中返回更改后的字符串?

时间:2017-09-24 10:49:43

标签: c++ visual-studio

我尝试创建一个读取文件并要求输入单词的程序。然后输出文件中使用的次数。

这是它正在阅读的文件中的内容:

此文件包含许多单词。很多很多的话。 好吧,也许它毕竟不是那么多。 那么,有多少人呢?

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;但改变后的单词不会返回我的主要功能。所以,我正在寻找可能出错的地方的帮助。

2 个答案:

答案 0 :(得分:2)

您的代码中有一个很小的重要错误。 您是通过值将字符串传递给RemovePunct和ToLowercase方法,而不是通过引用传递,因此您要更改字符串的副本,而不是字符串本身。

您应该按如下方式更改方法定义:

void ToLowercase(string & word) {

void RemovePunct(string & word) {

详细了解{{3}}

<强>编辑:

由于您现在通过引用将字符串作为输入/输出变量传递,因此从方法返回任何值也没有意义,因此返回类型现在为void,您应该省略return word;从这两种方法。

答案 1 :(得分:0)

您的函数RemovePunctToLowercase返回修改后的字符串,但您永远不会接受它。

您可以将循环内的代码更改为

word = RemovePunct(word);
word = ToLowercase(word);

或将功能设为:

void RemovePunct (std::string& wo );

void ToLowercase (std::string& wo);

然后删除两个函数中的return语句,正如另一个答案所说的那样。