C ++中getline的分段错误

时间:2013-11-19 23:12:33

标签: c++ string getline fault

我正在为我的编程课做作业。其中一个给定的函数原型是:

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变量,所以我删除了那部分,但是现在我运行程序时出现Segmentation故障。

2 个答案:

答案 0 :(得分:2)

您似乎将编译时错误与分段错误混淆:这是两个相当不同的事情。当代码违反语言规则时,就会发生编译时错误。在您的情况下,您尝试将值读入常量字符串(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,并且似乎不包含有效指针。

答案 1 :(得分:0)

您缺少返回值。成功:

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

免责声明:无错误检查