std :: vector делает странные вещи

0

(Извините, если мои предложения полны загадок, я сделаю все возможное, чтобы написать что-то читаемое) Привет, Я работаю над функцией, которая читает файл и хранит каждую строку, чей первый символ ":" и удаляет каждую черту, содержащуюся в строке. Каждый раз, когда найден этот тип линии, push_back() используется для хранения этой строки в векторе. Проблема в том, что каждый раз, когда используется push_back(), все элементы вектора принимают значение последнего. Я не понимаю, почему это происходит. Здесь код:

 string listContent;
 size_t dashPos;
 vector<char*>cTagsList;
 while(!SFHlist.eof())
 {
    getline(SFHlist,listContent);
    if(listContent[0]==':')
    {
        listContent.erase(0,1);
        dashPos = listContent.rfind("-",string::npos);
        while(dashPos!=string::npos)
        {
            listContent.pop_back();
            dashPos = listContent.rfind("-",string::npos);
        }
        char* c_listContent = (char*)listContent.c_str();
        cTagsList.push_back(c_listContent);
    }
 }

Сначала я думал, что это проблема с концом файла, но прерывание процесса поиска до достижения этой точки дает те же результаты.

  • 2
    Прежде всего, while (!eof()) не так. Во-вторых, приведение результата c_str к char * очень плохо. В-третьих, этот указатель недействителен, как только вы измените строку, что происходит сразу после. Используйте вектор из std::string . В любом случае, вы не удаляете каждую черту, вы удаляете все после, включая первую черту. Используйте std::remove и соедините его с erase .
  • 3
    Не хранить результаты c_str ! Вместо этого просто сделайте std::vector<std::string> cTagsList; вместо этого и просто cTagsList.push_back(listContent);
Показать ещё 4 комментария
Теги:
stdvector

1 ответ

2

c_str() -method состояний std :: string:

Возвращаемый указатель может быть аннулирован дальнейшими вызовами других функций-членов, которые изменяют объект.

Если вам разрешено использовать std :: vector <std :: string> вместо вектора char *, вы в порядке, так как всегда будет копия std :: string listContent, введенная в вектор, т.е.,

std::string listContent;
 size_t dashPos;
 std::vector<std::string>cTagsList;
 while(!SFHlist.eof())
 {
    getline(SFHlist,listContent);
    if(listContent[0]==':')
    {
        listContent.erase(0,1);
        dashPos = listContent.rfind("-",string::npos);
        while(dashPos!=string::npos)
        {
            listContent.pop_back();
            dashPos = listContent.rfind("-",string::npos);
        }
        cTagsList.push_back(listContent);
    }
 }

(Я его не тестировал)

  • 0
    Как я ответил на первый пост, мне нужен символ, но я постараюсь получить его, преобразовав std :: vector <std :: string> в символ, спасибо за помощь
  • 0
    Лезвие @Faeralis уже указывало на оператор [] std :: string, который обеспечивает произвольный доступ к каждому символу в строке, и что вы можете сделать альтернативно, это использовать .c_str (), как вы делали ранее, но для строк, уже сохраненных в вектор
Показать ещё 1 комментарий

Ещё вопросы

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