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;
}