【问题标题】:Segmentation fault with getline in C++C ++中getline的分段错误
【发布时间】:2013-11-19 23:12:32
【问题描述】:

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

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

【问题讨论】:

  • 发生分段错误时您使用什么代码? (P.S - GDB 是你的朋友)
  • 向我们展示你是如何调用它的,以及你在传递字符串后如何处理它。
  • 你在 const 提示中传递给 getline,你应该传递你想要读取文本写入的字符串变量。
  • 没有seg-fault,但显然是编译错误。
  • 这篇文章对我有帮助,尽管它的评价是负面的,所以我提高了它。我有一个完全专业化的函数模板,我忘记在其中包含一个 return 语句。与 OP 的程序不同,它实际上确实导致了分段错误

标签: c++ string getline fault


【解决方案1】:

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

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

鉴于该输入很有可能失败,这可能不是一个好主意,因为该接口似乎无条件成功。

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

没有const 的代码无法返回值,即存在另一种形式的未定义行为:未从非void 函数返回值是未定义行为。编译器可能注入了试图从某个寄存器或内存位置的内容构建std::string 并且似乎不包含有效指针的代码。

【讨论】:

    【解决方案2】:

    您缺少返回值。制作它:

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

    免责声明:没有错误检查

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2020-04-29
      • 2018-06-09
      • 2019-06-13
      • 2020-06-11
      • 2022-01-02
      相关资源
      最近更新 更多