没有重载函数的实例 "stoi" 与参数列表匹配
no instance of overloaded function "stoi" matches the argument list
我正在尝试编写一个函数,它有 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()
函数,因为对于包含此的每一行函数,我得到标题中的错误。
我想知道我做错了什么,以及这条错误消息的确切含义,以避免将来再遇到它。
提前致谢。
std::stoi 接受一个 std::string 作为它的参数,但是你给它一个字符。
您可以像这样通过强制转换直接将 char 转换为 int:
int num = ch1 - '0';
(您可能想编写一个函数来执行此操作,并使用适当的 C++ 样式转换)
或者,将字符转换为字符串,或者使用字符串开头
示例:
int main() {
char ch1 = '9';
int in1 = ch1 - '0';
std::cout << in1 << "\n";
}
std::stoi
需要一个 std::string
作为参数,但你给它一个 char
.
没有从char
到std::string
的直接转换,所以你需要明确说明:
stoi(string(1, ch1));
此处 string(1, ch1)
创建一个长度为 1
的字符串,仅包含字符 ch1
.
或者,如果你确定 ch1
是那个点的数字(如果不是,stoi
将抛出)你可以简单地减去 '0'
,因为数字保证在字符集中正确排序:
ch1 - '0'
或者更确切地说,您可能希望将 std::string
直接传递给您的函数,而不是多个单独的 char
。您可以使用 .substr
成员函数从字符串中获取子字符串。
我正在尝试编写一个函数,它有 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()
函数,因为对于包含此的每一行函数,我得到标题中的错误。
我想知道我做错了什么,以及这条错误消息的确切含义,以避免将来再遇到它。
提前致谢。
std::stoi 接受一个 std::string 作为它的参数,但是你给它一个字符。
您可以像这样通过强制转换直接将 char 转换为 int:
int num = ch1 - '0';
(您可能想编写一个函数来执行此操作,并使用适当的 C++ 样式转换)
或者,将字符转换为字符串,或者使用字符串开头
示例:
int main() {
char ch1 = '9';
int in1 = ch1 - '0';
std::cout << in1 << "\n";
}
std::stoi
需要一个 std::string
作为参数,但你给它一个 char
.
没有从char
到std::string
的直接转换,所以你需要明确说明:
stoi(string(1, ch1));
此处 string(1, ch1)
创建一个长度为 1
的字符串,仅包含字符 ch1
.
或者,如果你确定 ch1
是那个点的数字(如果不是,stoi
将抛出)你可以简单地减去 '0'
,因为数字保证在字符集中正确排序:
ch1 - '0'
或者更确切地说,您可能希望将 std::string
直接传递给您的函数,而不是多个单独的 char
。您可以使用 .substr
成员函数从字符串中获取子字符串。