这是我在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
我做错了吗?
答案 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;