首页 > 解决方案 > 如何在输入两次之前输入?

问题描述

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

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

标签: cloopsscanfbreakenter

解决方案


无法直接在 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 - 恢复 Monica建议使用int类型并检查EOF第一个代码片段。


推荐阅读