Разделить строку внутри конструктора класса

0

У меня есть класс с двумя членами данных: size и массив ints (динамически распределенный). Целью класса является создание массива размера и заполнение его значениями. Задача состоит в том, чтобы создать конструктор, который берет строку в качестве своего параметра, но строка выглядит так: "12 | 13 | 14 | 15" и т.д. Я искал это, но все решения являются слишком сложными, поскольку они включают векторов, и мы еще не начали с векторов. Я в основном хочу поместить эти числа в массив ints, 1 на 1, а также узнать размер массива. Как я могу это сделать? Я попытался возиться с getline и stringstream, но это дало мне массу ошибок. Мой код выглядит так.

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

class IntArrays {
private:
        static int objcount;
    int size;
public:
        int *arrayints;
        const static int objcountf();
    IntArrays(int);
    IntArrays(const IntArrays &p){
                size = p.size;
                for (int i = 0;i <size;i++){
                    arrayints[i] = p.arrayints[i];
                    }
                    }
IntArrays(std::string f){
                      // ignore the other constructors, this is the constructor that is giving me trouble
                      int counter =0;
                 istringstream inStream(f);
                 string newstring;
                 while (getline(iss,newstring, '|')){
                       arrayints[counter] = stoi(newstring);
                       counter++;}
void enternums();
(note that this is only the header file, and that the current string constructor I have there does not work.
  • 0
    У вас есть указатели arrayints , но вы никогда не инициализируете их. Это, конечно, приводит к неопределенному поведению, когда вы обращаетесь к нему.
Теги:
string
split
stringstream

3 ответа

1

Этот код - моя версия. Я предпочитаю использовать vector а не необработанный array.

Определение класса:

class IntArrays {
public:
    IntArrays(const string&, const char&);
    const vector<int>& data() { return _data; }
    const int size() { return _data.size(); }

private:
    vector<int> _data;
};

Ниже приведена реализация конструктора:

IntArrays::IntArrays(const string& str, const char& delimiter) {
    string buff;
    for(auto& n:str) {
        if(n != delimiter) buff+=n; else
        if(n == delimiter && buff != "") {
            _data.push_back(stoi(buff));
            buff = "";
        }
    }
    if(buff != "") _data.push_back(stoi(buff));
}

И тогда мы просто используем класс:

IntArrays a("1|4|9|6|69", '|');
vector<int> da = a.data();

IntArrays b("1,4,9,6,69", ',');
vector<int> db = b.data();
0

Как указал Йоахим, вы не инициализируете указатель. К сожалению, у вас нет размера массива перед распределением, поэтому у вас осталось несколько решений:

  1. обрабатывать ввод дважды (очень плохо, если у вас большое количество записей); На первом проходе подсчитайте входные данные. Затем выделите массив, а затем прочитайте их снова, в выделенный массив.

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

  3. Предварительно выделите блок памяти и надейтесь, что он достаточно большой, чтобы прочитать весь массив. Если это не так, перераспределите больший блок и скопируйте в него уже прочитанные значения, затем отбросьте начальный блок (это то, что делает std :: vector).

0

Я попытаюсь получить рекурсию для этого = p Извините, что я не могу предоставить версию c++ = p. Это версия java, я думаю.

list parse(string data, list base) {
    if (data.length > 0) {
        string s = data.subStr(0,1);
        if (s == "|") {
            base.push(0); //set the initial value for a new value
        } else {
            int i = parseInt(s);
            int result = base.pop()*10 + i; //recalculate the result
            base.push(result);
        }
        return parse(data.subStr(1),base); //recursion
    } else {
        return base; //return the result
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню