我试图在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不是一个选项。
答案 0 :(得分:3)
您使用stty raw
停用的终端设置还负责协调\r
和\n
。
您可以使用stty -icanon min 1
仅禁用缓冲,或者同时接受\r
和\n
作为输入。
PS:使用TCGETS / TCSETS ioctls来获取,修改和重新应用之前的设置,而不是调用stty
并在之后强制煮熟模式,这被认为是一种很好的做法。