按Enter键之前如何阅读用户输入?

时间:2017-02-09 00:26:26

标签: c

我试图在C中编写一个示例程序,逐个字符地读取用户输入,用户不必按Enter键。我使用了here看到的代码,它运行得很好,但有一个小问题。我想在输入时处理所有用户的输入,当我使用system(/bin/stty raw);时,程序无法再检测到它。如:

int n, i;
char buffer[50];
system ("/bin/stty raw");
for(i=0; i<30 ; i++) {

    buffer[i] = getchar();
    printf("%d\n", buffer[i] == '\n');   //this prints 0 when I press enter
    if(buffer[i] == '\n'){
        break;
    }
}
printf("%s\n",buffer);

system ("/bin/stty cooked");

有没有办法检测用户在执行此操作时按Enter键?

我实际上要做的是在用户输入之前阅读用户的输入,但在他们这样做时做一些事情。我想到这样做的另一种方式是,如果我不是逐个字符地阅读它,而是使用,例如fgets(buffer, 255, stdin);,有没有办法在用户按下enter之前读取stdin的缓冲区?我想使用Enter键,因此终止用户输入另一个字符,例如使用while((c=getchar())!= '.'){},使用here不是一个选项。

1 个答案:

答案 0 :(得分:3)

您使用stty raw停用的终端设置还负责协调\r\n

您可以使用stty -icanon min 1仅禁用缓冲,或者同时接受\r\n作为输入。

PS:使用TCGETS / TCSETS ioctls来获取,修改和重新应用之前的设置,而不是调用stty并在之后强制煮熟模式,这被认为是一种很好的做法。