0

我知道如何降低一个句子,但我想使用我的字符串修改类来做到这一点。出于某种原因,使用我的 Strmod 对象不起作用,而是通过主要工作来完成。下面是降句代码:

TL;DR,回答:原来我需要通过引用将字符串传递给对象!以下是有效的代码:

transform(statement.begin(), statement.end(), statement.begin(), tolower);

这是我的课程:

class Strmod {
public:
string lower(string &s) {
    transform(s.begin(), s.end(), s.begin(), tolower);
    return s;
    }
};

我这样称呼它:

int main(){
    string statement = "";
    getline(cin, statement);
    Strmod mod;
    mod.lower(statement);
    cout << statement;    //for debugging
}
4

3 回答 3

0

试试这个,它应该工作

string data = "";
getline(cin, data);
transform(data.begin(), data.end(), data.begin(), ::tolower);
cout<<data;

::引用全局命名空间而不是标准std::命名空间,否则你必须将它类型转换为它的相关返回类型,就像(int (*)(int))std::tolower你想将它引用到std命名空间一样

包括:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
于 2016-01-11T09:05:03.580 回答
0

让我解释一下不起作用的版本和起作用的版本之间的区别。在工作中,您正在修改字符串statementcout'ing 它,所以一切都按预期工作。但是,在不起作用的版本中,您调用该方法lower并按值向它提供字符串statement。这意味着,该方法获取statement. 该方法适用于复制的版本并返回它。由于您没有捕获函数的返回,因此statement您在 main 方法中引用的变量保持不变。它是按值传递的,也就是说只有它的一个副本被发送到该方法。试试这个版本的非工作代码,看看它实际上做了你想要完成的事情:

int main(){
    string statement = "";
    getline(cin, statement);
    Strmod mod;
    statement = mod.lower(statement); // see we are assigning the modified value to statement in order to capture the changed string
    cout << statement;    //for debugging
}

或者这个,您的方法的签名被更改以允许通过引用传递:

class Strmod {
public:
string lower(string &s) { // see the signature of the method changed for reference passing
    transform(s.begin(), s.end(), s.begin(), tolower);
    return s;
    }
};
于 2016-01-11T14:55:48.620 回答
0

该课程与您认为它不起作用的原因无关。问题与参数传递有关。您正在通过副本获取方法的字符串参数。

您会从独立功能中看到相同的结果。

string lower(string s) {
    transform(s.begin(), s.end(), s.begin(), tolower);
    return s;
}

string s = "TEST";  
lower(s);
std::cout << s;  //still "TEST"

解决方案是通过引用传递。
请注意,我也返回了一个引用,以允许嵌套函数调用。

string& lower(string &s) {
    transform(s.begin(), s.end(), s.begin(), tolower);
    return s;
}

您可能也不希望每次都实例化该类来调用该方法。如果是这样,请考虑制作方法static

struct Strmod {
    static string& lower(string &s) {
        transform(s.begin(), s.end(), s.begin(), tolower);
        return s;
    }
};

string s = "TEST";
Strmod::lower(s);

但是您可能正在寻找的语言功能是namespace

namespace Strmod {
    string& lower(string &s) {
        transform(s.begin(), s.end(), s.begin(), tolower);
        return s;
    }
};

string s = "TEST";
Strmod::lower(s);
于 2016-03-08T02:55:41.070 回答