功能调用无法正常工作

时间:2014-05-30 16:43:54

标签: c++ string function-calls

这是我的函数调用,它有一个原型,一切都编译好,除了我没有得到我想要的结果。

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,我是否正确地调用了该功能?

3 个答案:

答案 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;
}

http://ideone.com/u5WcYA

您可以将引用指针传递给您要修改的对象,即字符串对象。

在您的情况下,您可能(可能更好)使用函数签名中的结果值:

#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;
}

http://ideone.com/bZaS6l

在后一种方式中,您从对象中复制,对该副本进行操作,然后返回已修改的副本,从而获得正确的结果。

答案 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. 更改要通过引用传递的参数(并可选择删除返回值)
  2. 实际使用返回值
  3. 在实践中,1。是一个微不足道的变化,签名看起来像这样(并且不需要其他更改):

    string lower_case(string& x)
    

    此处字符串已修改到位。至于第二种解决方案,只需将调用函数的行更改为:

    str = lower_case(str);
    

    它也会起作用。请注意,使用第二个选项(可能)会产生两个副本:一个在调用lower_case时,一个在它被返回时(因此写回原始字符串对象,但是使用c ++ 11编译器可能会转换为移动,因此只留下一个副本。)

    希望这能回答你的问题,但我建议你做一个教程,因为它们不仅是C ++的绝对基础/基础,还有任何编程语言。