没有重载函数“ stoi”的实例与参数列表匹配

时间:2020-03-01 10:29:58

标签: c++ string visual-studio int

我正在尝试编写一个包含4个字符的函数,其中第一个和第三个字符为数字,第二和第四个字符为运算符,该函数将第一个和第三个字符转换为整数,并计算输出基于它们之间的运算符(或者如果存储在第四个字符中的运算符具有更高的优先级,则不这样做)。

这是我的尝试

#include <iostream>
#include<string>



using namespace std;

string calculate(char ch1,char ch2,char ch3,char ch4);


int main() {
    int i = 1;
    string input = "4/1+1-2*2" ;
    string part;
    int leng;
    while(1){

        char cha1 = input[i - 1];
        char cha2 = input[i];
        char cha3 = input[i + 1];
        char cha4 = input[i + 2];
        part = calculate(cha1,cha2,cha3,cha4);
        if (part == "NULL") {
            i += 2;
}
        else{ input = input.replace((i-1),3,part); }
        leng = input.size();
        if (i == leng - 1) {
            i = 1;
        }
    }





}

string calculate(char ch1, char ch2, char ch3, char ch4){
    int in1;
    int in3;
    int result;
    string part;


    if (ch2 == '-') {
        if (ch4 == '*') {
            part = 'NULL';



        }
        else if (ch4 == '/') {
            part = "NULL";
        }
        else {
            in1 = stoi(ch1);
            in3 = stoi(ch3);
            result = in1 - in3;


            part = to_string(result);
        }

    }

    else if (ch2 == '+') {
        if (ch4 == '*') {
            part = "NULL";
        }
        else if (ch4 == '/') {
            part = "NULL";
        }
        else {
            in1 = stoi(ch1);
            in3 = stoi(ch3);
            result = in1 + in3;

            part = to_string(result);

        }
    }


    else if (ch2 == '*') {
        if (ch4 == '*') {
            part = "NULL";
        }
        else if (ch4 == '/') {
            part = "NULL";
        }
        else {
            in1 = stoi(ch1);
            in3 = stoi(ch3);
            result = in1 * in3;

            part = to_string(result);
        }
    }

    else if (ch2 == '/') {
        if (ch4 == '*') {
            part = "NULL";
        }
        else if (ch4 == '/') {
            part = "NULL";
        }
        else {
            in1 = stoi(ch1);
            in3 = stoi(ch3);
            result = in1 * in3;


            part = to_string(result);

        }
    }



    return part;
}

该程序在当前状态下可能无法按预期运行,但我稍后会担心,因为现在我想处理stoi()函数,因为包含该函数的每一行,我收到标题错误。

我想知道我在做错什么,以及此错误消息的确切含义是避免将来再次出错。

谢谢。

2 个答案:

答案 0 :(得分:1)

std :: stoi将std :: string作为其参数,但是您给它一个字符。

您可以通过如下所示的转换直接将char转换为int:

int num = ch1 - '0';

(您可能想编写一个函数来执行此操作,并使用正确的c ++样式强制转换)

或者,将字符隐藏为字符串,或者使用字符串开头

示例:

int main() {
  char ch1 = '9';
  int in1 = ch1 - '0';
  std::cout << in1 << "\n";
}

答案 1 :(得分:1)

std::stoi期望以std::string作为参数,但是您只给了一个char

没有从charstd::string的直接转换,因此您需要对此进行明确说明:

stoi(string(1, ch1));

此处string(1, ch1)创建一个长度为1的字符串,仅包含字符ch1

或者,如果您确定ch1是那个数字(如果不是{stoi则抛出),您可以简单地减去'0',因为可以保证数字在字符集中正确排序:

ch1 - '0'

或者,您可能想直接将std::string传递给您的函数,而不是多个单独的char。您可以使用.substr成员函数从字符串中获取子字符串。