2014-11-19 3 views
0

У меня есть класс с двумя членами данных: размер и массив из целых чисел (динамически выделенных). Целью класса является создание массива размера и заполнение его значениями. Задача состоит в том, чтобы создать конструктор, который берет строку в качестве своего параметра, но строка выглядит так: «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', но вы никогда не инициализируете его. Это, конечно, приводит к [* неопределенному поведению *] (http://en.wikipedia.org/wiki/Undefined_behavior), когда вы разыгрываете его. –

ответ

0

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

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 
    } 
} 
0

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

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

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

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

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(); 
Смежные вопросы