В настоящее время я пытаюсь сохранить набор целых чисел в массиве int, переопределив строку в числа, а затем сохранить его в массиве - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь преобразовать входной текст / числа (строку), которые будут включать любые символы, но я хочу отделить числа от символов и сохранить их в массиве целых чисел, как только он будет преобразован из строки.

Я считаю, что проблема в том, что строка преобразуется в целое число с использованием stoi(), но я не могу определить проблему.

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

Есть идеи? Пример ввода1: 12, 13, 15 Пример ввода2: 12 13 15 Пример ввода3: 12ab13cd15ef

Результат в массиве целых чисел: 0 [12] 1 [13] 2 [15] Эти числа будут использоваться в определенном порядке, используя числа в массиве.

#include<iostream>
#include<string>
#include <sstream>
using namespace std;

int main()
{
    string datainput, str1, str3;
    cin >> datainput;
    int n = 0, raycount = 0, c;
    int myray[10];
    while (datainput[n])
    {
        if (datainput[n] == ('0') || datainput[n] == ('1') || datainput[n] == ('2') || datainput[n] == ('3') || datainput[n] == ('4') ||
            datainput[n] == ('5') || datainput[n] == ('6') || datainput[n] == ('7') || datainput[n] == ('8') || datainput[n] == ('9'))
        {
            str1 = datainput[n];
            str3 += str1;
        }
        else
        {
            c= stoi(str3);
            c >> myray[raycount];
            raycount++;
        }
        n++;
    }
    cout << myray[0] << endl;
    cout << myray[1] << endl;
    cout << myray[2] << endl;
    cout << myray[3] << endl;
    system("pause");
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Я вижу довольно много проблем с вашим кодом.

  • До C ++ 11 while (datainput[n]) имеет неопределенное поведение как только n достигает конца строки.

  • Способ проверки числовых цифр может быть значительно упрощен с помощью std::isdigit() или даже простой проверкой диапазона с использованием операторов >= и <=.

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

  • Вместо этого оператор c >> myray[raycount]; необходимо изменить на myray[raycount] = c;. И вы не нарушаете свой цикл, если raycount достигает максимальной емкости myray[].

  • Вы не сбрасываете str3 обратно в пустую строку после преобразования ее в std::stoi(). Вы просто продолжаете добавлять новые цифры к концу предыдущих цифр без перерыва между цифрами.

С учетом сказанного, попробуйте что-то более похожее на это:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string datainput, str3;
    cin >> datainput;

    int myray[10];
    int raycount = 0;

    bool gettingDigits = false;

    for (int n = 0; n < datainput.size(); ++n)
    {
        char ch = datainput[n];

        //if (isdigit(ch))
        if (ch >= '0' && ch <= '9')
        {
            if (!gettingDigits)
            {
                str3 = "";
                gettingDigits = true;
            }

            str3 += ch;
        }
        else
        {
            if (gettingDigits)
            {
                myray[raycount] = stoi(str3);
                raycount++;
                str3 = "";
                gettingDigits = false;
                if (raycount == 10) break;
            }
        }
    }

    if (gettingDigits && (raycount < 10))
    {
        myray[raycount] = stoi(str3);
        raycount++;
    }

    for (int n = 0; n < raycount; ++n)
        cout << myray[n] << endl;

    system("pause");
    return 0;
}

Live Demo

С другой стороны:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string datainput, str3;
    cin >> datainput;

    int myray[10];
    int raycount = 0;

    string::size_type start = datainput.find_first_of("0123456789");
    string::size_type end;

    while (start != string::npos)
    {
        end = datainput.find_first_not_of("0123456789", start+1);
        if (end == string::npos)
        {
            str3 = datainput.substr(start);
            myray[raycount] = stoi(str3);
            raycount++;
            break;
        }

        str3 = datainput.substr(start, end-start);
        myray[raycount] = stoi(str3);
        raycount++;
        if (raycount == 10) break;

        start = datainput.find_first_of("0123456789", end+1);
    }

    for (int n = 0; n < raycount; ++n)
        cout << myray[n] << endl;

    system("pause");
    return 0;
}

Live Demo

0 голосов
/ 08 мая 2019

Итак, вы хотите разделить цифры и символы в разные массивы. В блоке if вы проверяете наличие символов, поэтому я подозреваю, что stoi () не будет работать. Лучше, приведи его к целому числу.

int temp[10];

if (datainput[n] == ('0') || ...) {
            temp[n] = int(datainput[n]);
        }

Таким образом, ваш временный массив будет содержать числа.

...