C 如何在按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();

我正在尝试用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();
    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'