c++ - C++中getline的段错误

标签 c++ string getline fault

我正在为我的编程课做作业。给定的函数原型(prototype)之一是:

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 变量,所以我删除了那部分,但现在我在运行程序时遇到了段错误。

最佳答案

您似乎将编译时错误与段错误混淆了:这是两个截然不同的事情。当代码违反语言规则时会发生编译时错误。在您的情况下,您尝试将值读入常量字符串(const std::string const&)。这显然是行不通的。你宁愿使用

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

考虑到输入有一定的失败几率,这可能不是一个好主意,因为看起来这个接口(interface)无条件成功。

另一方面,段错误是运行时错误。更具体地说,当访问一 block 内存时,您会遇到段错误,而该内存未映射到具有适当访问权限的访问位置。通常,在访问的位置根本没有映射的内存。例如,如果您尝试取消引用空指针并写入它,您通常会遇到段错误。由于取消引用空指针的行为在形式上是未定义的,因此实际上无法保证会发生任何特定的事情。

没有const的代码返回值失败,即还有另一种形式的未定义行为:非void函数不返回值是未定义行为.编译器可能注入(inject)了试图从某些寄存器或内存位置的内容构建 std::string 的代码,但似乎不包含有效指针。

关于c++ - C++中getline的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084172/

相关文章:

java - 如何通过搜索某些字符从另一个字符串创建子字符串

C++ Getline简单错误

c++ - 在 CMake 构建中更改库依赖项

java - 使用 gcc 创建共享库

Ruby - 从另一个方法中提取我的较小方法(将字符串转换为两个数字和一个符号)

c# - 在 C# 中,检查 stringbuilder 是否包含子字符串的最佳方法

c++ - 使用 getline 读取文件/输入时出现段错误

c - 使用 emscripten 从标准输入读取得到不存在的换行符

c++ - 使用 C++ 每秒追加到磁盘上 JSON 文件中的 JSON 数组

c++ - 在 VS2013 中构建 boost 库