我试图在C ++程序中的数学符号的数量进行计数。我使用isdigit
摸不着头脑,但是当我通过我的字符串的值,它给了我一个警告。
这是我的代码。该生产线digito[i] = entrada[i]
是我认为问题在于,但我不明白为什么。
cout << "Input the operation" << endl;
cin >> input;
string digit[] = { "" };
string sign[]={""};
int cn = 0, cs = 0;
for (int i = 0; i < input.size(); i++) {
if (isdigit(input[i])) {
cout << "There is a digit in position " << i << endl;
cn += 1;
digit[i] = input[i];
}
else {
cout << "There is a sign in position " << i << endl;
// sign[i] = input[i];
cs += 1;
sign[i] = input[i];
}
}
它带我到这个代码的问题:
static _CONSTEXPR17 void assign(char& _Left, const char& _Right) noexcept
{ // assign an element
_Left = _Right;
}
这两个字符串是有问题的。你不必要地宣布他们与每一个元素数组,并初始化每个字符串为空。
string digito[] = { "" };
string signo[]={""};
然而事后,你与非零指数为它们编索引:
digito[i] = entrada[i];
这条线是有两个原因问题;超越数组边界,以及不兼容的类型。
digito[i]
是std::string
的类型(因为digito
是std::string[]
),而entrada[i]
是char
(假设entrada
是std::string
)。 std::string
有operator=
,允许分配给单个字符的过载,但是这不是你想要的这里,我承担。
至于第二个问题,std::string
需要你一个给定索引你之前放大随机访问它。在这种情况下,要做到这一点,最好的方法是在施工期间,删除错误阵列中使用:
std::cin >> entrada;
std::string digito(entrada.size(), ' ');
std::string signo(entrada.size(), ' ');
话虽这么说,我不知道如果这个代码,你希望它是什么。给定一个输入字符串:
2+2/3
你会得到两个这样的字符串:
digito = "2 2 3"
signo = " + / "
如果您的实际目的是来标记输入(分数字和运算),更好的办法是,使用两个std::vector<char>
s,或者甚至更好:
using Number = int;
enum class Operator { Plus, Minus, Div, Mul };
using Token = std::variant<Number, Operator>
using Sequence = std::vector<Token>;
一致的,强类型数据模型,将使它更容易编写产生它和操作,并且在随后的结果正确的代码。