【问题标题】:string subscript out of range error when assigning variable to function将变量分配给函数时出现字符串下标超出范围错误
【发布时间】:2021-06-16 08:02:58
【问题描述】:

为了更加熟悉 cpp,我开始编写一个程序,该程序使用幂规则对简单多项式进行导数。到目前为止,它对于诸如 5x^2+4x 之类的多项式运行良好。但是,如果多项式包含一个常数(如 5x + 3),我会得到一个字符串下标超出范围错误。我使用调试器并在第 33 行 (std::string term = differentiateTerm(*iter);) 上找到了错误触发器。我不确定我在这里做错了什么,我将不胜感激。

完整代码:

#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> terms;
std::vector<std::string>::const_iterator iter;

std::string takeDerivative(std::string expression);
void separateTerms(std::string expression);
std::string differentiateTerm(std::string inputTerm);

int main()
{
    std::string userExpression;

    std::cout << "Enter a polynomial.\n";
    std::cin >> userExpression;
    
    std::string outputExpression = takeDerivative(userExpression);

    std::cout << "The derivative of your expression is: " + outputExpression;
    return 0;
}

std::string takeDerivative(std::string expression)
{
    std::string derivative;

    separateTerms(expression);

    for (iter = terms.begin(); iter != terms.end(); iter++)
    {
        std::string term = differentiateTerm(*iter);
        if (iter - terms.begin() == 0)
        {
            derivative = term;
        }
        else
        {
            derivative += "+" + term;
        }

    }

    return derivative;
}

void separateTerms(std::string expression)
{
    int previousSign = 0;
    bool firstTerm = true;

    for (int i = 0; i < expression.size() + 1; i++)
    {
        if (expression[i] == '+' || expression[i] == '-')
        {
            if (firstTerm)
            {
                terms.push_back(expression.substr(0, i));
                firstTerm = false;
                previousSign = i;
            }
            else
            {
                terms.push_back(expression.substr(previousSign + 1, i - previousSign - 1));
                previousSign = i;
            }
        }
        else if (i == expression.size())
        {
            if (firstTerm)
            {
                terms.push_back(expression.substr(previousSign, i));
            }
            else
            {
                terms.push_back(expression.substr(previousSign + 1, i - previousSign));
            }
        }
    }
}

std::string differentiateTerm(std::string inputTerm)
{
    std::string outputTerm;
    int coefficient = 1;
    int exponent = 1;

    int varPos = inputTerm.find('x');

    if (inputTerm[varPos] == std::string::npos)
    {
        outputTerm = "0";
        return outputTerm;
    }
    else {
        if (inputTerm[varPos - 1] != std::string::npos)
        {
            coefficient = std::stoi(inputTerm.substr(0, varPos));
        }
        if (inputTerm[varPos + 1] == '^')
        {
            if (inputTerm[varPos + 2] != std::string::npos)
            {
                exponent = std::stoi(std::string(1, inputTerm[varPos + 2]));
            }
        }
    }

    coefficient = coefficient * exponent;
    exponent--;

    if (exponent <= 0)
    {
        outputTerm = std::to_string(coefficient);
    }
    else if (exponent == 1)
    {
        outputTerm = std::to_string(coefficient) + "x";
    }
    else
    {
        outputTerm = std::to_string(coefficient) + "x^" + std::to_string(exponent);
    }

    return outputTerm;
}

【问题讨论】:

  • 出于好奇,如何为函数赋值?我知道您可以传递参数或拥有全局变量,但我还没有弄清楚如何将变量分配给函数,例如my_function() = 3.14159;
  • main 中的最后一个cout 应该使用&lt;&lt;,而不是+。
  • @ThomasMatthews 的意思是说您将函数调用的结果分配给变量,而不是将变量分配给函数。 (你实际上是在初始化一个变量而不是赋值,但重点是术语的顺序被切换了。)

标签: c++ string subscript calculus


【解决方案1】:

您没有在differentiateTerm 中正确检查来自find 的返回值。这会导致inputTerm[varPos] 越界访问。

正确的检查是

if (varPos == std::string::npos)

在随后的if 语句中,由于您在varPos 中有一个有效的下标,您应该根据字符串的大小检查它。所以你会有if (varPos &gt; 0)、if (varPos &lt; inputTerm.size() - 1)等。

【讨论】:

  • 效果很好!我不敢相信我错过了这样一个小错误。非常感谢!
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
相关资源
最近更新 更多