这是我的函数调用,它有一个原型,一切都编译好,除了我没有得到我想要的结果。
string lower_case(string x)
{
transform(x.begin(), x.end(), x.begin(), ::tolower);
return x;
}
现在这个简单的函数接受字符串并使它全部小写,我需要在我的代码中执行这么多次,所以不是一直重写这个,我想为它调用函数,但是我我没有得到我想要的结果。例如,请使用以下代码:
int main()
{
string str = "HELLO WORLD";
lower_case(str);
cout<< str << endl;
return 0;
}
输出仍然是HELLO WORLD而不是hello world,我是否正确地调用了该功能?
答案 0 :(得分:5)
按值调用函数时,复制对象,因此退出函数时会丢弃结果。
这是正确的做法
#include <iostream>
#include <algorithm>
#include <ctype.h>
using namespace std;
void lower_case(string& x) // No return type needed
{
std::transform(x.begin(), x.end(), x.begin(), ::tolower);
}
int main()
{
string str = "HELLO WORLD";
lower_case(str);
cout << str;
return 0;
}
您可以将引用或指针传递给您要修改的对象,即字符串对象。
在您的情况下,您可能(可能更好)使用函数签名中的结果值:
#include <iostream>
#include <algorithm>
#include <ctype.h>
using namespace std;
string lower_case(string x) // Return type needed
{
std::transform(x.begin(), x.end(), x.begin(), ::tolower);
return x;
}
int main()
{
string str = "HELLO WORLD";
cout << lower_case(str);
return 0;
}
在后一种方式中,您从对象中复制,对该副本进行操作,然后返回已修改的副本,从而获得正确的结果。
答案 1 :(得分:4)
如果您不想更改函数以通过引用传递值,则可以为变量分配函数的返回值。
str = lower_case(str);
使用此:
int main()
{
string str = "HELLO WORLD";
str = lower_case(str);
cout<< str << endl;
return 0;
}
答案 2 :(得分:2)
您实际上并未输出任何内容,但假设您在调用lower_case
后输出了该内容,则不会更改str
。原因是您按值而不是通过引用(或指针)传递字符串。因此,lower_case会获取原始字符串的副本,然后将其修改,然后立即丢弃(因为您不使用返回值)。
要实际更改原始字符串,您可以执行以下两项操作之一:
在实践中,1。是一个微不足道的变化,签名看起来像这样(并且不需要其他更改):
string lower_case(string& x)
此处字符串已修改到位。至于第二种解决方案,只需将调用函数的行更改为:
str = lower_case(str);
它也会起作用。请注意,使用第二个选项(可能)会产生两个副本:一个在调用lower_case
时,一个在它被返回时(因此写回原始字符串对象,但是使用c ++ 11编译器可能会转换为移动,因此只留下一个副本。)
希望这能回答你的问题,但我建议你做一个教程,因为它们不仅是C ++的绝对基础/基础,还有任何编程语言。