如何避免使用getchar()按Enter

如何避免使用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下编译。


慕森王
浏览 1359回答 3
3回答

慕尼黑5688855

在linux系统上,可以使用stty命令。默认情况下,终端将缓冲所有信息,直到进入被按下,甚至在发送到C程序之前。一个快速的、肮脏的、而且不是特别便携的例子,可以从程序本身中改变行为:#include<stdio.h>int&nbsp;main(void){ &nbsp;&nbsp;int&nbsp;c; &nbsp;&nbsp;/*&nbsp;use&nbsp;system&nbsp;call&nbsp;to&nbsp;make&nbsp;terminal&nbsp;send&nbsp;all&nbsp;keystrokes&nbsp;directly&nbsp;to&nbsp;stdin&nbsp;*/ &nbsp;&nbsp;system&nbsp;("/bin/stty&nbsp;raw"); &nbsp;&nbsp;while((c=getchar())!=&nbsp;'.')&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;type&nbsp;a&nbsp;period&nbsp;to&nbsp;break&nbsp;out&nbsp;of&nbsp;the&nbsp;loop,&nbsp;since&nbsp;CTRL-D&nbsp;won't&nbsp;work&nbsp;raw&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;putchar(c); &nbsp;&nbsp;} &nbsp;&nbsp;/*&nbsp;use&nbsp;system&nbsp;call&nbsp;to&nbsp;set&nbsp;terminal&nbsp;behaviour&nbsp;to&nbsp;more&nbsp;normal&nbsp;behaviour&nbsp;*/ &nbsp;&nbsp;system&nbsp;("/bin/stty&nbsp;cooked"); &nbsp;&nbsp;return&nbsp;0;}请注意,这并不是最优的,因为它只是假定stty cooked是程序退出时所希望的行为,而不是检查原始终端设置。此外,由于在原始模式下跳过了所有特殊处理,所以许多关键序列(例如Ctrl-C或Ctrl-D)如果不显式地在程序中处理它们,就不会像您期望的那样工作。你可以的man stty要获得对终端行为的更多控制,完全取决于您想要实现的目标。

PIPIONE

这取决于您的操作系统,如果您是在类似UNIX的环境中,默认情况下ICANON标志是启用的,所以输入被缓冲到下一个'\n'或EOF..通过禁用规范模式,您将立即获得字符。这在其他平台上也是可能的,但是没有直接的跨平台解决方案。编辑:我看到您指定使用Ubuntu。我昨天刚刚发布了类似的内容,但请注意,这将禁用您的终端的许多默认行为。#include<stdio.h>#include&nbsp;<termios.h>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//termios,&nbsp;TCSANOW,&nbsp;ECHO,&nbsp;ICANON#include&nbsp;<unistd.h>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//STDIN_FILENOint&nbsp;main(void){&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;c;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;struct&nbsp;termios&nbsp;oldt,&nbsp;newt; &nbsp;&nbsp;&nbsp;&nbsp;/*tcgetattr&nbsp;gets&nbsp;the&nbsp;parameters&nbsp;of&nbsp;the&nbsp;current&nbsp;terminal &nbsp;&nbsp;&nbsp;&nbsp;STDIN_FILENO&nbsp;will&nbsp;tell&nbsp;tcgetattr&nbsp;that&nbsp;it&nbsp;should&nbsp;write&nbsp;the&nbsp;settings &nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;stdin&nbsp;to&nbsp;oldt*/ &nbsp;&nbsp;&nbsp;&nbsp;tcgetattr(&nbsp;STDIN_FILENO,&nbsp;&oldt); &nbsp;&nbsp;&nbsp;&nbsp;/*now&nbsp;the&nbsp;settings&nbsp;will&nbsp;be&nbsp;copied*/ &nbsp;&nbsp;&nbsp;&nbsp;newt&nbsp;=&nbsp;oldt; &nbsp;&nbsp;&nbsp;&nbsp;/*ICANON&nbsp;normally&nbsp;takes&nbsp;care&nbsp;that&nbsp;one&nbsp;line&nbsp;at&nbsp;a&nbsp;time&nbsp;will&nbsp;be&nbsp;processed &nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;means&nbsp;it&nbsp;will&nbsp;return&nbsp;if&nbsp;it&nbsp;sees&nbsp;a&nbsp;"\n"&nbsp;or&nbsp;an&nbsp;EOF&nbsp;or&nbsp;an&nbsp;EOL*/ &nbsp;&nbsp;&nbsp;&nbsp;newt.c_lflag&nbsp;&=&nbsp;~(ICANON);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;/*Those&nbsp;new&nbsp;settings&nbsp;will&nbsp;be&nbsp;set&nbsp;to&nbsp;STDIN &nbsp;&nbsp;&nbsp;&nbsp;TCSANOW&nbsp;tells&nbsp;tcsetattr&nbsp;to&nbsp;change&nbsp;attributes&nbsp;immediately.&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;tcsetattr(&nbsp;STDIN_FILENO,&nbsp;TCSANOW,&nbsp;&newt); &nbsp;&nbsp;&nbsp;&nbsp;/*This&nbsp;is&nbsp;your&nbsp;part: &nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;choose&nbsp;'e'&nbsp;to&nbsp;end&nbsp;input.&nbsp;Notice&nbsp;that&nbsp;EOF&nbsp;is&nbsp;also&nbsp;turned&nbsp;off &nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;the&nbsp;non-canonical&nbsp;mode*/ &nbsp;&nbsp;&nbsp;&nbsp;while((c=getchar())!=&nbsp;'e')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;/*restore&nbsp;the&nbsp;old&nbsp;settings*/ &nbsp;&nbsp;&nbsp;&nbsp;tcsetattr(&nbsp;STDIN_FILENO,&nbsp;TCSANOW,&nbsp;&oldt); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}你会注意到,每个角色都会出现两次。这是因为输入立即回显到终端,然后程序将其放回putchar()我也是。如果要将输入与输出分离,还必须转回波标志。只需将适当的行更改为:newt.c_lflag&nbsp;&=&nbsp;~(ICANON&nbsp;|&nbsp;ECHO);

临摹微笑

getchar()是一个标准函数,在许多平台上要求您按Enter来获取输入,因为平台缓冲输入直到按下该键。许多编译器/平台支持不关心Enter的非标准Getch()(绕过平台缓冲,将Enter视为另一个键)。
打开App,查看更多内容
随时随地看视频慕课网APP