这个C ++方法是否按预期工作?

时间:2011-12-11 01:34:31

标签: c++ string methods char substr

这是我在C ++中的代码:

string searchValue(string& str, char tag)
{

    size_t pos1;
    size_t pos2;

    pos1=str.find(tag);
    pos2=str.find(tag,pos1+1);
    string result=(str.substr( pos1+1 ,(pos2-(pos1+1)) ));

    str=str.substr(pos2+1);

    return result;
}

目的是将一个字符串(例如= < feature token = "do" id = "98" freq = "1" />)和一个字符(tag='\"'作为参数放入。)

我打算让这个方法返回包含2次出现的标记参数的字符串,同时删除字符串 str 的部分到(包括)第二次出现标签的位置

这是我的目标,我期待命令:

string s="< feature token = \"do\" id = \"98\" freq = \"1\" />";
cout<<searchValue(s,'\"')<<endl<<searchValue(s,'\"')<<endl<<searchValue(s,'\"')<<endl;

显示

do
98
1

我做错了吗?

1 个答案:

答案 0 :(得分:3)

你做错了是假设在&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;表达式按从左到右的顺序进行评估。他们不一定。在这种情况下,您的编译器会从右到左对它们进行评估。

(澄清一下,由于最初的问题没有说,他所看到的行为是它正在打印出来:

1
98
do

代替。 (或者至少,这就是我的假设,因为这是我用g ++编译时得到的)

正在发生的事情是,运算符两侧的表达式都必须在运算符之前运行,但它们可以按任意顺序运行。无论出于何种原因,在这种情况下,您的编译器首先运行对searchValue的最右边调用,然后是中间调用,然后是左侧调用。由于searchValue改变了s,当然这会改变答案。

您可能认为您编写的代码可以保证给您相同的答案:

  string s="< feature token = \"do\" id = \"98\" freq = \"1\" />";
  string x = searchValue(s,'\"');
  string y = searchValue(s,'\"');
  string z = searchValue(s,'\"');
  cout << x << endl << y << endl << z << endl;

但事实并非如此,至少在这种特殊情况下,事实并非如此。如果您运行该代码,您将看到它为您提供了预期的结果。您的代码正在运行,就好像它是这样写的:

  string s="< feature token = \"do\" id = \"98\" freq = \"1\" />";
  string z = searchValue(s,'\"');
  string y = searchValue(s,'\"');
  string x = searchValue(s,'\"');
  cout << x << endl << y << endl << z << endl;