C++输入只接受操作符符号或仅数字 我一直试图把这个代码作为C++初学者的一个程序来帮助我理解更多的语言,但是我真的不知道如何解决这个问题。
基本上,程序只需要接受“+”、“*”、“/”、“%”或数字,否则会说输入无效 这是我到目前为止所做的C++输入只接受操作符符号或仅数字 我一直试图把这个代码作为C++初学者的一个程序来帮助我理解更多的语言,但是我真的不知道如何解决这个问题。,c++,C++,基本上,程序只需要接受“+”、“*”、“/”、“%”或数字,否则会说输入无效 这是我到目前为止所做的 #include <iostream> #include <string> using namespace std; int main() { string x; cout<<"Enter expression: "; getline(cin,x); if(x.find('*') != string::npos){
#include <iostream>
#include <string>
using namespace std;
int main()
{
string x;
cout<<"Enter expression: ";
getline(cin,x);
if(x.find('*') != string::npos){
cout<<"Multiplication";
}else if(x.find('/') != string::npos){
cout<<"Division";
}else if(x.find('%') != string::npos){
cout<<"Modulo";
}else if(x.find('+') != string::npos){
cout<<"Addition";
}else{
cout<<"Invalid!";
}
return 0;
}
有效输入的定义
这里我假设有效的输入由以下自然语句给出。首先,正如你提到的
每个输入必须由*、/、%、+和一个整数构成
只有零或一个操作。所以1+1是有效的
对于整数的输入,我还假设
允许在输入字符串的左侧和右侧使用
非空白字符之间不允许有空白字符
对于负整数,第一个非空白字符必须是0、1、…、9或-
第二个和后续的非空白字符必须是0、1、…、8或9
注意,在我的假设中,正号字符+,小数点字符。不允许使用整数输入。
比如说这个定义,
123、123、123和-123都是有效的整数输入。
abc、123a、123、+123和1.0都是无效的。
整数的有效性检查函数
首先,为了检查整数输入的有效性,我们使用以下方法修剪输入并删除左空格和右空格:如果可以使用C++17,从性能角度来看,std::string_视图更可取
#include <string>
std::string trimLR(const std::string& str)
{
const auto strBegin = str.find_first_not_of(" \f\n\r\t\v");
if (strBegin == std::string::npos){
return "";
}
const auto strEnd = str.find_last_not_of(" \f\n\r\t\v");
const auto strRange = strEnd - strBegin + 1;
return str.substr(strBegin, strRange);
}
主要功能
现在,实现主功能变得简单明了。
以下代码将检查输入并正常工作。
接下来要考虑的是编写测试和性能调整:
那你有什么要求?不清楚。很抱歉,如果不清楚,基本上如果输入是字符串或字符,则会说输入无效,否则如果是逻辑运算符符号或整数,则输出会说输入无效。您需要更正式地指定输入规则。现在,abcdef*是有效的输入。请问如何输入?我是C++的新手,需要解析输入流的每个字符。另外,您可能希望考虑在输入不清楚的情况下该怎么做。例如,如果有多个操作员,您确定吗?如果我在输入12+34*4中写入,那么该程序的输入是否有效?
#include <string>
#include <algorithm>
bool isInteger(const std::string& s)
{
const auto ts = trimLR(s);
if(ts.empty()){
return false;
}
const std::size_t offset = (ts[0] == '-') ? 1 : 0;
const auto begin = ts.cbegin() + offset;
return (begin != ts.cend()) // false if s is just a negative sign "-"
&& std::all_of(begin, ts.cend(), [](unsigned char c){
return std::isdigit(c);
});
}
#include <iostream>
int main()
{
std::string x;
std::cout << "Enter expression: ";
std::getline(std::cin, x);
const auto optPos = x.find_first_of("*/%+");
if (optPos == std::string::npos)
{
if(isInteger(x)){
std::cout << "Valid input, " << x;
}
else{
std::cout << "Invalid input, " << x;
}
return 0;
}
const auto left = x.substr(0, optPos);
const auto opt = x.substr(optPos, 1);
const auto right = x.substr(std::min(optPos+1, x.length()-1));
if (!isInteger(left) || !isInteger(right))
{
std::cout
<< "Either `" << left << "`, `" << right
<< "` or both are invalid inputs." << std::endl;
return 0;
}
const auto leftVal = std::stod(left);
const auto rightVal = std::stod(right);
if(opt == "*")
{
std::cout
<< "Multiplication: "
<< x << " = " << (leftVal * rightVal);
}
else if(opt == "/")
{
std::cout
<< "Division: "
<< x << " = " << (leftVal / rightVal);
}
else if(opt == "%")
{
std::cout
<< "Modulo: "
<< x << " = " << (std::stoi(left) % std::stoi(right));
}
else if(opt == "+")
{
std::cout
<< "Addition: "
<< x << " = " << (leftVal + rightVal);
}
return 0;
}