Я работаю над заданием для моего класса программирования. Один из прототипов данной функции:
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
переменная, поэтому я удалил эту часть, но теперь я получаю ошибку сегментации при запуске программы.
Вам не хватает возвращаемого значения. Сделай это:
string read_text()
{
string prompt
cout << "Enter your text: ";
getline(cin, prompt);
return prompt;
}
Отказ от ответственности: нет проверки ошибок
Кажется, вы путаете ошибку времени компиляции с ошибкой сегментации: это две довольно разные вещи. Ошибки во время компиляции происходят, когда код нарушает правила языка. В вашем случае вы пытаетесь прочитать значения в константную строку (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
из содержимого какого-либо регистра или ячейки памяти, и это, кажется, не содержит действительный указатель.