【问题标题】:Is this C++ method working as intended? [closed]此 C++ 方法是否按预期工作? [关闭]
【发布时间】:2012-01-17 16:17:03
【问题描述】:

这是我的 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;
}

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

我打算让这个方法返回包含在 tag 参数的 2 次出现之间的字符串,同时删除字符串的部分 str 直到(并包括) tag 第二次出现的位置。

这是我的目标,我希望得到命令:

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

显示

do
98
1

我做错了吗?

【问题讨论】:

  • 我们有大量的格式化文档。新人不是不读它的借口。
  • 嗯,它符合你的预期吗?
  • 您似乎只是告诉我们您对代码的期望,而不是您实际得到的。
  • 你试过编译了吗?
  • @TomalakGeret'kal 虽然我同意您的信息精神,但让我们更好地欢迎新成员。我们不想变得像 comp.lang.c++ usenet 组。

标签: c++ string methods char substr


【解决方案1】:

您做错了什么是假设

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

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;

【讨论】:

  • “因为左移运算符从左到右分组,所以首先计算左子表达式,然后计算右子表达式。” --描述一个例子,here.
  • 微软的 C++ 编译器很可能就是这种情况,但 C++ 标准并没有规定必须以任何特定顺序对运算符的输入进行求值。这取决于编译器,甚至不需要编译器保持一致。它可以在不同的时间以不同的方式做它,当它感觉像它时。当这段代码在 g++ 中运行时,这显然是发生了什么。
  • @John:一般来说,有副作用的函数是可以使用的 PITA。搜索功能没有修改输入的业务。 - 在这种情况下,如果你想保护自己免受这些问题的影响,你必须将搜索的返回类型设为void,所以它不能用于更大的表达式,并通过一个 out 参数返回结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2016-03-09
  • 2020-11-12
  • 2013-03-26
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多