string — ошибка сегментации с getline в переполнении стека

Я работаю над заданием для моего класса программирования. Один из прототипов данной функции:

string read_text(const string & prompt);

Я написал определение функции как:

string read_text(const string & prompt)
{
cout << "Enter your text: ";
getline(cin, prompt);
}

Тем не менее, это дает мне ошибку:

freq.cpp: In function 'std::string read_text(const std::string&)':
freq.cpp:80: error: no matching function for call to 'getline(std::istream&, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'

Я читал, что getline не должен ссылаться на const переменная, поэтому я удалил эту часть, но теперь я получаю ошибку сегментации при запуске программы.

0

Решение

Вам не хватает возвращаемого значения. Сделай это:

string read_text()
{
string prompt
cout << "Enter your text: ";
getline(cin, prompt);
return prompt;
}

Отказ от ответственности: нет проверки ошибок

0

Другие решения

Кажется, вы путаете ошибку времени компиляции с ошибкой сегментации: это две довольно разные вещи. Ошибки во время компиляции происходят, когда код нарушает правила языка. В вашем случае вы пытаетесь прочитать значения в константную строку (const std::string const&). Это явно не должно работать. Вы скорее хотите использовать

std::string read_text()
{
std::string prompt;
std::cout << "Enter your text: ";
std::getline(std::cin, prompt);
return prompt;
}

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

ошибка сегментации, с другой стороны, это ошибка времени выполнения. В частности, вы получаете ошибку сегментации при доступе к фрагменту памяти, который не сопоставлен в доступном месте с соответствующими правами доступа. Как правило, в доступном месте нет памяти, отображаемой вообще. Например, если вы попытаетесь разыменовать нулевой указатель и выполнить запись в него, вы, как правило, получаете ошибку сегментации. Поскольку поведение разыменования нулевого указателя формально не определено, фактически нет никакой гарантии, что что-то конкретное произойдет.

Код без const не может вернуть значение, то есть существует другая форма неопределенного поведения: не возвращать значение из неvoid функция неопределенного поведения. Компилятор, вероятно, внедрил код, который пытается построить std::string из содержимого какого-либо регистра или ячейки памяти, и это, кажется, не содержит действительный указатель.

2

По вопросам рекламы [email protected]