当前位置: 首页 > 知识库问答 >
问题:

由于cin的字符串中未捕获空格而导致的分段错误

沈树
2023-03-14

我正在努力实现调车场算法来评估简单的表达式。代码似乎可以工作,但如果有空格就会崩溃。这是令人惊讶的,因为有一个特定的空白检查似乎根本没有抓住它。

using namespace std;


mpz_class exprToTokens(string expression);
int precedence(const char op);
mpz_class applyOperation(const mpz_class a, const mpz_class b, const char op);

int main() {



    try {
    while(true)
    {
            cout << "enter an expression: ";
            string expr;
            cin >> expr;
            if( expr == "e")
            {
        break;
            }
            cout << "output: " << exprToTokens(expr) << endl;
    }

    } catch( const std::exception & ex ) {
       cerr << "message: " << ex.what() << endl;
    }

    return 0;
}

mpz_class exprToTokens(string expression)
{

    stack<char> operators;
    stack<mpz_class> output;


    unsigned int i = 0;
    while(i < expression.length())
    {
        if(isspace(static_cast<unsigned char>(expression.at(i))))//skip white space
        {
            cout << "is space" << endl;//never happens
            i++;
            continue;
        }
        else if(isdigit(expression[i]))
        {
            unsigned int j = i;
            while(i < expression.length() && isdigit(expression[j]))
            {
                j++;
            }
            const string number = expression.substr(i, j-i);
            const mpz_class term(number);
            output.push(term);
            i = j;
            continue;
        }
        else//token is an operator
        {
            while(!operators.empty() && precedence(operators.top() >= precedence(expression[i])))
            {
                const mpz_class val1 = output.top();
                output.pop();

                const mpz_class val2 = output.top();
                output.pop();

                const char op = operators.top();
                operators.pop();

                output.push(applyOperation(val1, val2, op));
            }
            operators.push(expression[i]);
        }
        i++;
    }

    /*process remaining operations and values on stacks*/
    while(!operators.empty())
    {
        const mpz_class val2 = output.top();//something bad happens here when spaces are around operator
        output.pop();

        const mpz_class val1 = output.top();
        output.pop();

        const char op = operators.top();
        operators.pop();

        output.push(applyOperation(val1, val2, op));
    }

    return output.top();
}

int precedence(const char op)
{ 
    if(op == '+' || op == '-')
        return 1; 
    if(op == '*' || op == '/') 
        return 2; 
    return 3;
} 


mpz_class applyOperation(const mpz_class a, const mpz_class b, const char op)
{
    switch(op)
    { 
        case '+': return a + b; 
        case '-': return a - b; 
        case '*': return a * b; 
        case '/': return a / b;
        default: throw invalid_argument("syntax not recognized");
    } 
}

例如,33给出了6结果,但33导致分段错误。有什么想法吗?

旁白:调车场算法将中缀转换为后缀符号。所以严格地说,修改算法以实际计算表达式是很常见的,但它仍然是调车场算法吗?对于普通算法,是否还需要另一个算法以后缀符号计算表达式?

共有1个答案

戴原
2023-03-14

cin

您的程序可能会在解析第一个时崩溃,因为此循环不会检查j

while(i < expression.length() && isdigit(expression[j]))
{
    j++;
}

 类似资料:
  • 当req.query.filter是一个没有空格的字符串时,比如'education'······这管用。当我试图找到一个有空格的列名时,比如'this havs空格',这个查询不起作用。我怎么才能修好这个?

  • 我试图通过以下教程将我们的在线WordPress网站克隆到localhost(使用XAMPP):https://looks-awesome.com/copying-live-wordpress-site-localhost 一切都很容易理解,顺利进行,直到我试图加载网站。每当我试图打开索引时。php或wp管理员向我显示此错误:“致命错误:未捕获错误:[]C:\xampp\htdocs中的字符串不支

  • 我得到这个错误。我创建了一个按钮来更新表。当我点击按钮时,我得到一个错误。如何修复它? 致命错误:Uncaught ArgumentCounter错误:函数personel::update_form(),0的参数太少,在C:\xampp\htdocs\warehouse\panel\system\core\CodeIgniter中传递。php在第360行,C:\xampp\htdocs\wareh

  • 问题内容: 我正在将postgres 9.1与tablefunc:crosstab一起使用 我有一个具有以下结构的表: 这由每天获取数据的脚本填充。因此可能看起来像这样: 然后,我使用以下交叉表查询来透视表: 运行这个我得到结果: 问题: 在表中使用大量实际数据运行时,我注意到对于某些字段,该函数将结果分为两行: 我检查了dt和instrument字段是否相同,并通过将交叉表的输出分组来产生了解决

  • 问题内容: 我需要一个类似于的函数,但可能会有多个空格,并且有意义的字符之间的空格数也不相同。像这样: 我可以以某种方式使用正则表达式来捕捉它们之间的空格吗? 问题答案: 如果您不向传递任何参数,它将把空格运行视为单个分隔符: 或者如果你想

  • 嗨,我是一个初学者,正在创建简单的wordpress模板。在我的函数中,除了粗体的代码行之外,其他一切都可以工作。php文件(wp_enqueue('jquery');)。当我排除它时,错误消失了,但我在查看源代码时没有看到wordpress添加的JQuery。不确定这是代码问题还是Jquery版本问题。我尝试添加JQuery迁移插件,但仍然出现相同的错误。我在本地机器上运行所有这些由拉拉贡设置。