2017-02-09 137 views
0

我想在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"); 

有没有一种方法来检测用户按下回车执行此操作时?

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

+0

用'raw',你有'icrnl'和/或'inlcr'打开吗?这些与输入上的CR到NL('\ r'到'\ n')映射有关。尝试:'system(“/ bin/stty -a”);'在你的代码中 - 可能甚至两次,在开启'raw'之前一次,之后一次。或者,换句话说,在原始模式下工作时,您需要捕获'\ r'而不是或''n'。 –

+0

这是所有的代码。真的,我所遗漏的只是'int main()'和'return 0;' –

+0

如果你正在寻找我,Luke,那么我并不是说你应该创建更多的MCVE。我告诉你,'stty raw'命令正在改变终端中的大量设置,其中一些与CR('\ r')到NL('\ n')的转换有关,反之亦然。我还建议你可以尝试在“stty raw”之前和之后找到设置 - 这将帮助你确定发生了什么变化。另外,正如答案中指出的那样,您应该考虑使用POSIX''标题和相关函数来更直接地管理终端设置。 –

回答

3

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

您可以使用stty -icanon min 1仅禁用缓冲,或者接受\r\n作为回车。 PS:使用TCGETS/TCSETS ioctls来获取,修改和重新应用先前的设置,而不是调用stty,并在之后强制执行熟化模式,这被认为是很好的做法。

+0

对不起,但我不太明白。你的意思是我应该检查\ r而不是\ n?如果是这样,那很好。 编辑:没关系,我试过了,它可以和'buffer [i] =='\ r''一起使用 –