【问题标题】:How to take input until enter is pressed twice?如何在输入两次之前输入?
【发布时间】:2021-10-29 03:09:59
【问题描述】:

当用户按两次输入时,我想打破这个循环。意思是,如果用户第二次没有输入字符,而只是再次按回车,则循环必须中断。

char ch;
while(1) {
    scanf("%c",&ch);
    
    if(ch=='') { // I don't know what needs to be in this condition
        break;
    }
}

【问题讨论】:

  • 使用fgets 阅读整行。如果fgets返回非空指针,检查字符串长度是否为空。这表示一个空行。
  • 另外,请花一些时间阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后,如果你想问一个 C 问题,那么请不要添加其他无关的语言标签。
  • @Some 但是让我补充一下,这个问题在第一次提问的前 5% 中!它有一些代码(好的,不能按原样编译,但仍然)以及对意图和问题的合理描述。赞成:-)。
  • 值得一提的是,scanf%c 转换的特殊之处在于它不会忽略换行符而是简单地扫描它,就像输入流中的任何其他字节一样。大多数其他转换,如 %d、%f、%s 解析“单词”并且不关心分隔它们的空格,可能包括换行符。像这样的问题是交互式练习程序的典型问题,但对于现实世界的问题却不典型:您最后一次与在线模式下的控制台程序交互是什么时候?

标签: c loops scanf break enter


【解决方案1】:

无法直接在 C 中检测按键,因为标准 I/O 函数旨在用于终端,而不是直接响应键盘。相反,您可以使用诸如ncurses 之类的库。

但是,坚持使用纯 C,我们可以检测换行符。如果我们跟踪最后两个读取的字符,我们可以实现类似的行为,这对于您的用例来说可能已经足够好了:

#include <stdio.h>

int main(void)
{
    int currentChar;
    int previousChar = '\0';
    while ((currentChar = getchar()) != EOF)
    {
        if (previousChar == '\n' && currentChar == '\n')
        { 
            printf("Two newlines. Exit.\n");
            break;
        }
        if (currentChar != '\n')
            printf("Current char: %c\n", currentChar);

        previousChar = currentChar;
    }
}

编辑:似乎目标不是检测两次输入,而是让用户:

  • 输入一个值,然后返回,或
  • 在不输入值的情况下输入 return,然后程序应该退出。

更通用的解决方案,例如读取整数,可构造如下:

#include <stdio.h>

#define BUFFER_SIZE 64U

int main(void)
{
    char lineBuffer[BUFFER_SIZE];
    while (fgets(lineBuffer, BUFFER_SIZE, stdin) != NULL)
    {
        if (lineBuffer[0] == '\n')
        {
            printf("Exit.\n");
            break;
        }

        int n;
        if (sscanf(lineBuffer, "%d", &n) == 1)
            printf("Read integer: %d\n", n);
        else
            printf("Did not read an integer\n");

    }
}

请注意,现在有一个最大行长。这对于读取单个整数是可以的,但可能不适用于解析更长的输入。

致谢chux - Reinstate Monica 建议使用 int 类型并在第一个代码 sn-p 中检查 EOF

【讨论】:

    【解决方案2】:

    现在像魅力一样工作

    char ch[10];
    while(1){
        
         fgets(ch, sizeof ch, stdin);
        
        if(ch[0]=='\n'){
            break;
        }
       
        
        
    }
    

    【讨论】:

    • 永远不要永远使用gets!它是so dangerous,因此它甚至已从 C 标准中删除。更好地使用while (fgets(ch, sizeof ch, stdin) != NULL &amp;&amp; strlen(ch) != 0) { /* Main part of the loop */ }
    • 这不会检测到“直到双输入”。它只检测一个空行。如果第一行为空,则循环中断。如果 line"123456789\n",则此代码将退出循环。 IAC,更好的代码也会检查fgets()的返回值。
    • @chux-ReinstateMonica 为什么程序遇到"123456789\n"会退出循环?
    • 为了获得我的支持,除了提供问题的解决方案外,通常还应该发布一个帖子:(1) 解释解决方案,最好提及任何绊脚石,并说明为什么它比其他可能的解决方案更好; (2) 执行错误检查(或者,为了不分散讨论的主题,可能会明确说明它丢失了); (3) 正确格式化代码; (4) 理想情况下,使用合理尊重和正确的语言。
    • @Peter-ReinstateMonica "为什么程序遇到"123456789\n"时会退出循环" --> 首先fgets(ch, 10, stdin)读入"123456789",下一个fgets(ch, 10, stdin)读入"\n" .循环退出。
    【解决方案3】:

    你可以存储前一个字符并与当前字符比较并输入,像这样:

    char ch = 'a', prevch = '\n';
    while(1){
        scanf("%c",&ch);
        if((ch=='\n') && (ch == prevch)){// don't know what needs to be in this condition
            break;
        }
        prevch = c;
    }
    

    注意前一个字符默认是回车,因为我们希望程序在用户一开始就按回车时停止。

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2015-12-27
      • 2021-01-21
      • 2023-01-08
      相关资源
      最近更新 更多