变量在`if`语句中具有不同的值

时间:2014-08-11 10:57:24

标签: c++

在我的课堂上,我宣称iprivate 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”的值有些完全不同。

1 个答案:

答案 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; }