在我的课堂上,我宣称i
为private int i
在我的一个类函数中,我声明i = 0
,如下所示:
void Expression::tokenize()
{
i = 0;
cout<<"i before is:"<< i <<endl;
strcpy(exp, expression.c_str());
char *p = strtok(exp, " ");
while (p != NULL)
{
if(strcmp(p, "+"))
{
cout<<"i after is:"<< i <<endl;
ops[i] = *p;
};
p = strtok(NULL, " ");
};
}
“i before”的值为0,但“i after”的值有些完全不同。
答案 0 :(得分:0)
您显然已经发现了具体问题(并且可能至少相信您已经修复了它)。
这更多是关于如何避免这些问题的开始。您将字符串拆分为由一个或多个空格分隔的标记。在C ++中,你可以使用类似这样的代码来更干净地做到这一点:
std::istringstream buffer(expression);
std::string token;
while (buffer >> token) {
if (token == "+")
ops.push_back(token);
您可以使用标准算法进一步清理它:
std::istringstream buffer(expression);
std::copy_if(std::istream_iterator<std::string>(buffer),
std::istream_ierator<std::string>(),
std::back_inserter(ops),
[](std::string const &s) { return s=="+"; });
我在这里对你的意图做了一些猜测。就像现在一样,您的代码会将每个+
存储到ops[0]
,因为您永远不会增加i
,但我猜这是一个疏忽或简化为发布,你真的打算将它们存储到连续的位置。同样,我猜你真的想存储任何运算符,所以你可能真的想要一个更像这样的lambda表达式:
[](std::string const &s) { return s.find_first_of("+-*/") != std::string::npos; }