#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. У вас обоих были полезные отзывы, спасибо! Похоже, у меня просто разбросаны логические ошибки, которые мне нужно пересмотреть.