C 如何在按enter键之前读取用户输入?
我正在尝试用C编写一个示例程序,它可以一个字符一个字符地读取用户输入,而用户不必按enter键。我使用了所看到的代码,它工作得很好,但有一点问题。当用户按enter键时,以及当我使用C 如何在按enter键之前读取用户输入?,c,C,我正在尝试用C编写一个示例程序,它可以一个字符一个字符地读取用户输入,而用户不必按enter键。我使用了所看到的代码,它工作得很好,但有一点问题。当用户按enter键时,以及当我使用system(/bin/sttyraw)时,我希望处理用户的所有输入,程序无法再检测到它。例如: int n, i; char buffer[50]; system ("/bin/stty raw"); for(i=0; i<30 ; i++) { buffer[i] = getchar();
system(/bin/sttyraw)时,我希望处理用户的所有输入代码>,程序无法再检测到它。例如:
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");
intn,i;
字符缓冲区[50];
系统(“/bin/stty raw”);
对于(i=0;i使用stty raw
禁用的终端设置也负责协调\r
和\n
您可以使用stty-icanon min 1
仅禁用缓冲,或者接受\r
和\n
作为输入
PS:使用TCGETS/TCSETS ioctls获取、修改和重新应用以前的设置,而不是调用stty
并在之后强制使用熟食模式,这被认为是一种良好的做法。使用stty raw
禁用的终端设置也负责协调\r
和\n
您可以使用stty-icanon min 1
仅禁用缓冲,或者接受\r
和\n
作为输入
PS:使用TCGETS/TCSETS ioctls获取、修改和重新应用以前的设置,而不是调用stty
并在之后强制使用熟食模式,这被认为是一种良好的做法。对于raw
,您是否启用了icrl
和/或inlcr
?这些与CR到NL相关(\r
到\n
)在输入上映射。请尝试:system(“/bin/stty-a”)
在你的代码中-甚至可能两次,一次是在打开raw
之前,一次是在这样做之后。或者,换句话说,当你在raw模式下工作时,你很有可能需要陷阱\r
而不是\n
。这就是所有的代码。真的,我只遗漏了int main()
和返回0;
如果你对我讲话,卢克,那么我不是说你应该创建更多的MCVE。我告诉你stty raw
命令正在改变你终端中的许多设置,其中一些设置与CR(\r
)到NL(\n
)的转换有关反之亦然。我还建议您可以在执行stty raw
之前和之后尝试查找设置,这将帮助您确定发生了哪些更改。此外,正如回答中所指出的,您应该研究使用POSIX
头和相关函数更直接地管理终端设置。您可以在程序篡改终端控件之前捕获stty-g的输出可能会很有用(使用popen()
)然后,您可以使用该字符串将终端重置为运行stty-g
时的确切状态。还请注意,有一个原因getchar
返回int
,而不是char
,并且您在这里导致的从int
到char
的隐式缩小转换会丢弃信息…找出这些信息是什么,因为它可能对您解决尚未注意到的错误有用。使用raw
,您是否启用了icrnl
和/或inlcr
?这些与输入上的CR到NL(\r
到\n
)映射有关。请尝试:系统(“/bin/stty-a”)
在你的代码中-甚至可能两次,一次是在打开raw
之前,一次是在这样做之后。或者,换句话说,当你在raw模式下工作时,你很有可能需要陷阱\r
而不是\n
。这就是所有的代码。真的,我只遗漏了int main()
和返回0;
如果你对我讲话,卢克,那么我不是说你应该创建更多的MCVE。我告诉你stty raw
命令正在改变你终端中的许多设置,其中一些设置与CR(\r
)到NL(\n
)的转换有关反之亦然。我还建议您可以在执行stty raw
之前和之后尝试查找设置,这将帮助您确定发生了哪些更改。此外,正如回答中所指出的,您应该研究使用POSIX
头和相关函数更直接地管理终端设置。您可以在程序篡改终端控件之前捕获stty-g的输出可能会很有用(使用popen()
)然后,您可以使用该字符串将终端重置为运行stty-g
时的确切状态。还请注意,有一个原因getchar
返回int
,而不是char
,并且您在这里导致的从int
到char
的隐式缩小转换会丢弃信息…找出这些信息是什么,因为它可能对解决您尚未注意到的错误很有用。抱歉,但我不太明白。您的意思是我应该检查\r而不是\n?如果是,那很好。编辑:没关系,我尝试过,它与buffer[I]一起工作='\r'
对不起,我不太明白。你的意思是我应该检查\r而不是\n?如果是,那很好。编辑:没关系,我试过了,它与缓冲区[I]='\r'