【问题标题】:C++: ctrl+d terminates program (ubuntu)C++:ctrl+d 终止程序(ubuntu)
【发布时间】:2017-08-29 21:13:25
【问题描述】:

(C++ 新手)

我有这个简单的代码(为问题简化):

 int main()
{
    string currInput;
    while (getline(cin, currInput))
    {
    }
    cout << "wont be printed" << std::flush;
    return 0;
}

我已经调试了一段时间,我可能错过了一些东西:

当运行它并按下 ctrl+d (在某些字符串之后或立即)时,它不会打印 while 循环之后的字符串。它只是停止运行。我认为这可能与潮红有关,所以我也添加了它。 我错过了什么?

PS:在调试中运行时,它提到了一些关于 sighup 信号的内容。

【问题讨论】:

  • “它提到了一些关于 sighup 信号的事情” 您可能想要添加代码来忽略 SIGHUP 信号。
  • 我们还没有学过信号,我也找不到任何处理这个的例子,你有什么参考吗?
  • @kobi: 你是怎么运行那个程序的?
  • 打开终端。启动程序。按 ctrl+d。
  • 它似乎是这样工作的!都是cLion的错?有没有办法改变它的行为?你能在你的机器上用 cLion 试试吗(如果你安装了它)?

标签: c++ cout eof clion


【解决方案1】:

因此,在@manni 和@rici 的大力帮助下,我们找到了问题所在。

事实证明这是 cLion 中的一个已知问题。

sending EOF to stdin in Clion IDE

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206849765-How-to-enter-EOF-Ctrl-z-in-Run-console-

https://youtrack.jetbrains.com/issue/IDEA-12514

【讨论】:

    【解决方案2】:

    您的错误是 while 循环。您不应该在这里使用循环。发生的事情是它到达这条线并尝试获取输入。无论您是否输入任何内容,如果您点击 CTRL+D 它将结束 getline。但是你在一个while循环中......所以它会跳回到循环的顶部并得到另一行......然后是另一行......然后是另一行。欢迎来到您的第一个无限循环。

    while (getline(cin, currInput))
    {
    }
    

    最简单的事情就是这样做

    getline(cin, currInput);
    

    如果您刚开始编程,这可能就是您想要做的事情。

    如果你有胆量,请阅读此页面:http://www.cplusplus.com/reference/string/string/getline/

    您会注意到 getline 返回您传入的流。就循环而言,它将评估为 true

    【讨论】:

    • 首先,感谢您的评论。我知道这不是编写此代码的正确方法,我想为该问题简化更复杂的代码。它没有进入无限循环,它退出并返回0而不打印最后一行。
    • 哦,哈哈。你说“(C++新手)”所以我想你是全新的。
    • @KobiT 如果是这样,那么 SIGHUP 链接是一个不错的选择。了解如何处理信号。
    • 这段代码在不处理的情况下如何工作:stackoverflow.com/questions/20756968/… 在哪些情况下我应该处理它?我见过很多使用 getline 进行 while 循环的例子,但没有一个提到它。
    • en.cppreference.com/w/cpp/io/basic_ios/operator_bool 解释了返回 istream 的函数是如何设计以处理条件和 while 语句的。
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2014-10-19
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多