C++ 如何将方程解释为字符串C++(不是 C)

C++ How to interpret an Equation as a string C++ (NOT C)

本文关键字:C++ 不是 字符串 解释 方程      更新时间:2023-10-16

我正在尝试用C++制作一个程序,用户将在其中输入一个方程,(例如:y = 3x + 6)。我将如何确定什么是值,什么是角色,以及它们在哪里?

所以从例子中,我会知道:

  • 值 3 位于位置 stringArray[4]
  • 值 6 位于位置 字符串数组[9]
  • 字符 x 位于位置字符串数组[5]

我该怎么写?

当我在Visual Studio 2013中输入y = 3x时,它会出现一个错误框:

Unhandled exception at 0x77662EEC in Graphmatica_WhatsInDatInput.exe: Microsoft C++ exception: std::invalid_argument at memory location 0x00FAF94C.

但是当我输入任何不以字符开头的内容时,它很好(例如 1 + 3x

这是我到目前为止的代码:

#include <iostream>
#include <string>
using namespace std;
int main(){
    string Equation;
    double dNumber;
    cout << ": ";
    getline(cin, Equation);

    for (int i = 0; i < Equation.size(); i++){
        if (isdigit(Equation[i])) {
            cout << "Number: ";
            dNumber = stod(Equation);
            cout << dNumber << endl;
        }
        else {
            if (Equation[i] != ' ') {
                cout << "Character" << endl;
            }
        }
    }
    cout << endl;
    system("pause");
}

您的错误是由于以下行:

dNumber = stod(Equation);

它的异常文档说:如果无法执行转换,则会抛出std::invalid_argument异常。

当您输入字母时,无法执行转换,并且您得到异常。

其次,您正在尝试将整个方程转换为双精度值。如果是这种情况,检查字符串中的每个索引是否都是数字有什么意义?

我想你的意思是说:stod(to_string(Equation[I]))代替..

您还可以使用 C 中已经为您提供的转换函数创建自己的转换函数。

#include <iostream>
#include <string>
using namespace std;
inline double strtodouble(char c) noexcept
{
    return strtod(&c, NULL);
}
inline double strtodouble(const char* str) noexcept
{
    return strtod(str, NULL);
}
inline double strtodouble(const std::string str) noexcept
{
    return strtod(str.c_str(), NULL);
}

int main()
{
    string Equation;
    double dNumber;
    cout << ": ";
    getline(cin, Equation);

    for (int i = 0; i < Equation.size(); i++)
    {
        if (isdigit(Equation[i]))
        {
            cout << "Number: ";
            dNumber = strtodouble(Equation[i]);
            cout << dNumber << endl;
        }
        else
        {
            if (Equation[i] != ' ')
            {
                cout << "Character" << endl;
            }
        }
    }
    cout << endl;
    system("pause");
}