когда вы помещаете char_back в вектор в c ++ - PullRequest
3 голосов
/ 02 июля 2011

У меня проблемы с вставкой char * в вектор

Когда я делаю следующее:

string str = "Hello b World d"
char *cstr, *p;
vector<char*> redn;
cstr = new char [ (str.size)+1 ];
strcpy(cstr, str.c_str());

//here I tokenize "Hello b World d"
p = strtok(cstr," ");  
while(p!=NULL){
    redn.push_back(p);
    cout << "just pushed back: " << redn.back() << endl;
    p = strtok(NULL," ");
}
delete[] cstr;

//now check

for(it= redn.begin(); it < redn.end(); it++)
     cout << *it << endl;

Я получаю вывод:

just pushed back: Hello
just pushed back: b
just pushed back: World
just pushed back: d
p0s

World
d

Мне кажется, что * это указывает на неправильную вещь ... Кто-нибудь скажет мне, что происходит и как я могу это исправить?

Ответы [ 3 ]

4 голосов
/ 02 июля 2011

Почему бы вам просто не использовать vector<std::string>? Тогда это будет выглядеть так:

#include <string>
#include <sstream>
#include <iterator>
#include <vector>
#include <iostream>

int main() {
    std::string s = "Hello b World d";
    std::stringstream stream(s);
    std::vector<std::string> tokens(
        (std::istream_iterator<std::string>(stream)),
        (std::istream_iterator<std::string>()));
    for(std::vector<std::string>::iterator it = tokens.begin();
        it != tokens.end(); ++it)
        std::cout << *it << std::endl;
}
3 голосов
/ 02 июля 2011

Что не так в вашем коде?

Другие ответы объясняют, как сделать это лучше.Мой ответ объясняет, почему ваш код не работает так, как вы ожидали, и быстрое исправление, чтобы заставить его работать.

С оператором:

delete[] cstr;

Вы удаляете строку после нажатияобъект в векторе, это заставляет ваши векторные элементы указывать на что-то, что уже было выделено.

закомментируйте эту строку и проверьте снова, она будет работать.

Здесь рабочий образец вашего кода на Ideone.

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

См. this , чтобы узнать, как это сделать.

0 голосов
/ 02 июля 2011

Для итераторов STL используйте следующий синтаксис:

vector<char*>::iterator it;
for(it= redn.begin(); 
    it != redn.end(); 
    ++it)
{
   cout << *it << endl;
}

(обратите внимание, что ++ повышает производительность алгоритма)

...