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

вопрос создан в Wed, May 8, 2019 12:00 AM

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

Я считаю, что проблема в том, что строка преобразуется в целое число с использованием 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;
}
    
0
2 ответа                              2                         

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

  • До 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;
}

Демонстрационная версия

В качестве альтернативы: р>

#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;
}

Демонстрационная версия

    
0
2019-05-08 21: 43: 34Z
  1. Спасибо за ваш вклад! Я применил некоторые из предложенных вами изменений, и это шаги в правильном направлении. Также высоко оцените другие методы, которые сделают код проще. Сброс строк и целых чисел, казалось, решил проблему с накоплением, но я все еще застрял на том, чтобы собрать все числа в массив и преобразовать строку в число. Я просмотрю код, который вы разместили, и посмотрю, смогу ли я решить свою проблему. : -)
    2019-05-08 20: 06: 06Z
  2. @ Daniel было бы полезно, если бы вы отредактировали свой вопрос, чтобы показать фактический ввод, который вы вводите, и то, как должен выглядеть ожидаемый результат.
    2019-05-08 20: 09: 37Z
  3. Я добавил 3 примера, которые должны давать тот же результат.
    2019-05-08 20: 39: 55Z
  4. @ Даниэль Я обновил свой ответ. В моем первом примере произошла ошибка, которую я исправил.
    2019-05-08 21: 38: 44Z

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

int temp[10];

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

Это вау вашего временного массива будут цифры.

    
- 1
2019-05-08 16: 34: 59Z
  1. Я был бы признателен, если бы вы сказали мне, почему этот ответ опущен? Спасибо.
    2019-05-13 08: 34: 19Z
источник размещен Вот