C++ 如何将方程解释为字符串C++(不是 C)
C++ How to interpret an Equation as a string C++ (NOT C)
我正在尝试用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");
}
相关文章:
- 检查输入是否不是整数或数字
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么使用SFINAE而不是函数重载
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么std::valarray不是算术的
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 为什么make_tie不是一件事
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 为什么std::isnan 不是 constexpr?
- GlobalAlloc而不是其他分配方法
- 当比特(而不是字节)的顺序至关重要时的持久性
- 为什么复制而不是移动数据元素?
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和