Передача значений в массив внутри цикла - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать программу на 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;
}

1 Ответ

0 голосов
/ 05 февраля 2019

Эти две строки проблематичны.Вы излишне объявили их как массивы с одним элементом каждый и инициализировали каждую строку как пустую.

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

Однако после этого вы индексируете их с ненулевыми индексами:

digito[i] = entrada[i];

Эта строка проблематична по двум причинам;выход за границы массива и несовместимые типы.

digito[i] - это тип std::string (поскольку digito равен std::string[]), а entrada[i] равен char (при условии entradastd::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> с, либо, еще лучше:

using Number = int;
enum class Operator { Plus, Minus, Div, Mul };
using Token = std::variant<Number, Operator>
using Sequence = std::vector<Token>;

Согласованная модель данных со строгим типом данных значительно упростит запись правильныхкод, который его производит и впоследствии работает с результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...