一个循环内将值传递到一个数组

问题描述 投票:2回答:1

我试图在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;
}
c++ arrays c++11 visual-c++
1个回答
2
投票

这两个字符串是有问题的。你不必要地宣布他们与每一个元素数组,并初始化每个字符串为空。

string digito[] = { "" };
string signo[]={""};

然而事后,你与非零指数为它们编索引:

digito[i] = entrada[i];

这条线是有两个原因问题;超越数组边界,以及不兼容的类型。

digito[i]std::string的类型(因为digitostd::string[]),而entrada[i]char(假设entradastd::string)。 std::stringoperator=,允许分配给单个字符的过载,但是这不是你想要的这里,我承担。

至于第二个问题,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>;

一致的,强类型数据模型,将使它更容易编写产生它和操作,并且在随后的结果正确的代码。

© www.soinside.com 2019 - 2024. All rights reserved.