Ошибка сегментации при возврате вектора

#c

#c

Вопрос:

Я пытаюсь заполнить вектор строками пользовательского ввода, и каждый раз, когда я запускаю программу и вызываю функцию, я получаю ошибку сегментации независимо от того, что я ввожу. Я довольно неопытен, и любой ввод приветствуется. Проблема в моей функции entry(), каждый раз, когда я пытаюсь ввести строку, моя программа выходит из строя. Я хотел бы знать, почему я каждый раз вижу ошибку сегментации в одном и том же месте. Я упускаю что-то очевидное?

 #include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>

class Interface   
{
private:
    std::vector<std::string> storage;
    std::vector<bool> flag;
int i;
std::string temp;
//temp
int t;
public:
void entry();
void display();
void remove();
void complete();
void exit();
void recursiveBonus();

};

void Interface::entry()
{
i = 0;
do
{
    std::cout << "Please enter a task:" << std::endl;
    getline(std::cin, temp);
    storage.push_back(temp);
    flag.push_back(false);
    i  ;
}while(storage[i] != " ");
};
 

Комментарии:

1. std::vector<std::string> storage (" "); не компилируется для меня

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

3. Ваша логика кажется немного ошибочной для цикла. Я предполагаю, что вы хотите завершить цикл, когда была введена пустая строка? Тогда вы должны проверить это. Т.е. if (temp.empty()) { break; }

4. Что касается вашей проблемы, используйте отладчик, чтобы выяснить, где происходит сбой в вашем коде. Когда вы обнаруживаете сбой «в действии» в отладчике, вы можете проверить значения задействованных переменных, чтобы убедиться, что они выглядят нормально. Одна вещь, которую вам действительно нужно проверить, — это если this это нулевой указатель.

5. Наконец, еще одна вещь: переменная temp и i должна быть не переменными-членами, а локальными переменными внутри entry функции. Даже если вы используете их в другой функции, они и там должны быть локальными переменными.

Ответ №1:

Предполагая, что storage это пустое значение при вводе entry() :

Рассмотрим первую итерацию цикла. Сначала i == 0 вы считываете строку и push_back вводите ее storage . Затем вы увеличиваете i . Теперь i == 1 . Затем проверяется условие цикла, для которого storage[i] , т. Е. storage[1] Выполняется доступ. Индекс 1 представляет второй элемент в векторе, но вы вставили только один! Поэтому здесь у вас неопределенное поведение, что, вероятно, является причиной ошибки сегментации.

Кроме того, если вы хотите проверить, что последнее введенное значение пусто, вам нужно протестировать "" , а не " " . Последняя строка является не пустой, а с одним пробелом. Другие советы см. В комментариях к вопросу.

Комментарии:

1. У вас обоих были полезные отзывы, спасибо! Похоже, у меня просто разбросаны логические ошибки, которые мне нужно пересмотреть.