str.erase();在函数内部不起作用

时间:2013-05-16 21:49:38

标签: c++

我这里有一个忽略注释行的代码。问题是,我尝试使用我所拥有的功能创建一个函数,以便我可以在以后的任何地方使用它。但我遇到了一个问题。我的代码:

#include <iostream>
#include <string>

using namespace std;
string comment(string str);

int main ()
{
  string str;
  cout << "Enter the string> ";
  getline( cin, str );
  comment(str);
  cout << str << "\n";

  return 0;
}

string comment(string str)
{

  unsigned found = str.find('#');
  if (found!=std::string::npos)
    str.erase(found);
  else
    return(str);           

  return(str);

}

示例输入:(来自键盘)     输入字符串&gt;我的名字是#comment

我得到的输出:

my name is #comment

输出我应该得到:

my name is

此外,如果我使用相同的代码没有该功能,我得到正确的答案。这是:

#include <iostream>
#include <string>

using namespace std;

int main ()
{
  string str;

  cout << "Enter the string> ";
  getline( cin, str );
  unsigned found = str.find('#');
  if (found!=std::string::npos)
    str.erase(found);


  cout << str << "\n";

  return 0;
}

1 个答案:

答案 0 :(得分:3)

您必须通过引用传递字符串

void comment(string& str)
^^^^                 ^^^

或者从函数接收返回的值。

getline( cin, str );
str = comment(str);
^^^

否则该函数会收到字符串的副本。您在str功能中执行的任何修改comment都不会在main中显示。