我知道如何降低句子,但我想使用我的字符串修改类来这样做。出于某种原因,使用我的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
}
答案 0 :(得分: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;
答案 1 :(得分:0)
让我解释一下这个版本不起作用的区别。在工作中,您正在修改字符串statement
和cout
,因此一切都按预期工作。但是,在不起作用的版本中,您调用方法lower
并按值为其提供字符串statement
。这意味着,该方法获得statement
的副本。该方法适用于复制的版本并返回它。由于您没有捕获函数的返回值,因此您在main方法中引用的statement
变量保持不变。它是通过值传递的,也就是说只有它的副本被发送到该方法。试试这个版本的非工作代码,看看它实际上是你想要完成的事情:
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;
}
};
答案 2 :(得分: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);