【问题标题】:Shift + Enter vs Enter in consoleShift + Enter 与控制台中的 Enter
【发布时间】:2020-02-26 19:23:44
【问题描述】:

我正在尝试捕获通过 stdin 流输入的所有字符,但 EOF 除外。我想输入一个多行文本:每行末尾有\n

int getline(char s[])
{
    printf("Call-getline()\n");

    int c;
    int idx=0;

    while((c=getchar()) != EOF)
    {
        s[idx++] = c;
    }

    printf("\n-EOF found--\n");

    s[idx] = '\0';

    return idx;
}

我不知道如何摆脱按回车键时得到的\n,我想知道shif+enterenter alone 是否有任何区别。我阅读了它在 Microsoft Word 中的作用:新段落与换行符。

【问题讨论】:

  • 这个答案:Removing trailing newline character from fgets() input 展示了如何从字符串中删除最后的换行符。您没有使用fgets 并不重要,并且当那里没有换行符时是安全的。那就是s[strcspn(s, "\n")] = 0;
  • 是的,这是我的错误。应该只有s[idx] = '\0',因为当循环退出时,idx 已经加一。
  • @WeatherVane , s[--idx] = '\0' 不会一直工作,因为当您按下 enter 时,代码块控制台将始终在任何输入流中推送换行符?
  • 这会覆盖enter(换行符)。但如果它不存在,它要么覆盖您想要的字符,要么如果没有任何输入,则索引 s[-1],这很糟糕。但我所指的评论已被删除,尽管它正确识别出s[++idx] = '\0';的问题
  • 您的 getline 函数不安全,因为它不检查数组边界。

标签: c shift enter


【解决方案1】:

答案Removing trailing newline character from fgets() input 已链接在 cmets 中,它会向您展示解决方案。

但是,我想在这里指出另一件事。结束输入的常用方法是按 Ctrl+D,这会将 EOF 发送到程序。或者至少大多数(全部?)*nix 终端都可以。但这是特定于您使用的终端的详细信息,因此您必须阅读特定终端的文档。

我找到了this 答案,它告诉您如何在 Windows 上执行此操作。不幸的是,答案基本上是您无法以好的方式做到这一点。

【讨论】:

  • 我使用的是 Windows,所以我在最后一行尝试使用 CTRL + Z,但它不起作用。例如:Here is the text as if i was to input and so forth and here i put ^Z 之后我按回车键。什么都没有发生,它只是转到下一行
  • 在 Windows 上,Ctrl-Z 仅在按下 Enter 后立即起作用,并且还需要另一个 Enter。
  • 所以正常情况下,只要Ctrl-Z不是该行的第一个元素后跟按键ENTER,它就不起作用
【解决方案2】:

如果我没记错的话,我们可以按 CTRL + C 退出 Visual Studio 和 Dev C++ 控制台 否则,如果我们谈论 CMD,那么您应该写 exit 后跟 Enter

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多