为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免使用getchar()按Enter

如何避免使用getchar()按Enter

C
慕森王 2019-06-17 15:58:43
如何避免使用getchar()按Enter在下一个代码中:#include <stdio.h>int main(void) {      int c;      while ((c=getchar())!= EOF)           putchar(c);    return 0;}我得按下进入打印我输入的所有信件getchar,但我不想这样做,我想做的是按下这封信,立即看到我介绍的信没有按下就重复了一遍进入..例如,如果我按下字母‘a’,我想看到它旁边的另一个‘a’,依此类推:aabbccddeeff.....但是当我按“a”没有发生任何事情时,我可以写其他信件,只有当我按下时才会显示副本。进入:abcdef abcdef我该怎么做?我正在使用命令cc -o example example.c在Ubuntu下编译。
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

在linux系统上,可以使用stty命令。默认情况下,终端将缓冲所有信息,直到进入被按下,甚至在发送到C程序之前。

一个快速的、肮脏的、而且不是特别便携的例子,可以从程序本身中改变行为:

#include<stdio.h>int main(void){
  int c;
  /* use system call to make terminal send all keystrokes directly to stdin */
  system ("/bin/stty raw");
  while((c=getchar())!= '.') {
    /* type a period to break out of the loop, since CTRL-D won't work raw */
    putchar(c);
  }
  /* use system call to set terminal behaviour to more normal behaviour */
  system ("/bin/stty cooked");
  return 0;}

请注意,这并不是最优的,因为它只是假定stty cooked是程序退出时所希望的行为,而不是检查原始终端设置。此外,由于在原始模式下跳过了所有特殊处理,所以许多关键序列(例如Ctrl-CCtrl-D)如果不显式地在程序中处理它们,就不会像您期望的那样工作。

你可以的man stty要获得对终端行为的更多控制,完全取决于您想要实现的目标。


查看完整回答
反对 回复 2019-06-17
?
PIPIONE

TA贡献1829条经验 获得超9个赞

这取决于您的操作系统,如果您是在类似UNIX的环境中,默认情况下ICANON标志是启用的,所以输入被缓冲到下一个'\n'EOF..通过禁用规范模式,您将立即获得字符。这在其他平台上也是可能的,但是没有直接的跨平台解决方案。

编辑:我看到您指定使用Ubuntu。我昨天刚刚发布了类似的内容,但请注意,这将禁用您的终端的许多默认行为。

#include<stdio.h>#include <termios.h>            //termios, TCSANOW, ECHO, ICANON#include <unistd.h>    
 //STDIN_FILENOint main(void){   
    int c;   
    static struct termios oldt, newt;

    /*tcgetattr gets the parameters of the current terminal
    STDIN_FILENO will tell tcgetattr that it should write the settings
    of stdin to oldt*/
    tcgetattr( STDIN_FILENO, &oldt);
    /*now the settings will be copied*/
    newt = oldt;

    /*ICANON normally takes care that one line at a time will be processed
    that means it will return if it sees a "\n" or an EOF or an EOL*/
    newt.c_lflag &= ~(ICANON);          

    /*Those new settings will be set to STDIN
    TCSANOW tells tcsetattr to change attributes immediately. */
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);

    /*This is your part:
    I choose 'e' to end input. Notice that EOF is also turned off
    in the non-canonical mode*/
    while((c=getchar())!= 'e')      
        putchar(c);                 

    /*restore the old settings*/
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);


    return 0;}

你会注意到,每个角色都会出现两次。这是因为输入立即回显到终端,然后程序将其放回putchar()我也是。如果要将输入与输出分离,还必须转回波标志。只需将适当的行更改为:

newt.c_lflag &= ~(ICANON | ECHO);


查看完整回答
反对 回复 2019-06-17
?
临摹微笑

TA贡献1982条经验 获得超2个赞

getchar()是一个标准函数,在许多平台上要求您按Enter来获取输入,因为平台缓冲输入直到按下该键。许多编译器/平台支持不关心Enter的非标准Getch()(绕过平台缓冲,将Enter视为另一个键)。


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 1358 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信