2013-02-23 2 views
2

У меня есть некоторые проблемы с использованием strcpy с vector экземпляров моего собственного класса. Вот класс:Использование strcpy с std :: vector

class elemente { 
    char name[5]; 
    short val; 
    bool red; 
}; 

Итак, я сделал вектор из этого класса:

vector<elemente> ele(1); 

Но если я пытаюсь сделать эту операцию:

strcpy(ele.back().name, strtok(line, " ")); 

Я всегда получаю Сегментация Неисправность. Зачем?

Я использовал GDB для отладки моей программы, а переменная line верна, а также, если я заменю вектор нормальным char *, все работает нормально (программы не работают, но контент в порядке).

Что я могу сделать?

+1

Поскольку результат 'strtok' имеет более чем 4-х символы? –

+6

Вы программируете на C++, а не C. Так что избавитесь от функций 'strcpy' и' strtok' и измените тип 'elemente :: name' на' std :: string' – LihO

+0

Невозможно, я проверил его с другим переменная, результат равен 2 символам – StefanEuSunt

ответ

2

Поскольку вы используете C++, вы должны использовать функции, которые этот язык предоставляет вам вместо того, чтобы бороться с кодом стиля C. Хорошо, что вы решили использовать std::vector, поэтому продолжайте и используйте std::string для хранения строк, std::istringstream для создания входного потока, который вы будете читать маркеры, и std::getline, чтобы получить эти жетоны.

Сначала используйте спецификаторpublicдоступа, чтобы атрибуты elemente класса доступны за рамки этого класса и изменить тип name к std::string:

class elemente 
{ 
public: 
    std::string name; 
    // ... 
}; 

Затем извлечение лексем из линия может выглядеть так:

#include <iostream> 
#include <vector> 
#include <sstream> 
... 

std::vector<elemente> elements; 
std::string line("this is my input line"); 

std::istringstream lineStream(line); 
for (std::string word; std::getline(lineStream, word, ' ');) 
{ 
    if (!word.empty()) 
    { 
     elements.push_back(elemente()); 
     elements.back().name = word; 
    } 
} 

И для проверки этого кода вы можете просто распечатать все имена, хранящиеся в элементах этот вектор:

std::vector<elemente>::iterator e; 
for(e = elements.begin(); e != elements.end(); ++e) 
    std::cout << e->name << "."; 

выходов:

this.is.my.input.line. 

В качестве альтернативы вы можете создать открытый конструктор вашего класса, так что вы можете построить свои элементы с правильно инициализированы членами:

class elemente 
{ 
public: 
    elemente(const std::string& s) : name(s){ } 
// ... 
    std::string name; 
    // ... 
}; 

Тогда разбор маркеров станет следующим:

for (std::string word; std::getline(lineStream, word, ' ');) 
{ 
    if (!word.empty()) 
     elements.push_back(elemente(word)); 
} 

Надеется, что это помогает :)

+0

Большое спасибо, я почти забыл, что использую C++, я не должен пытаться изобретать колесо :) – StefanEuSunt

Смежные вопросы