ANSI C无回声键盘输入

我一直在谷歌搜索没有运气。 我正在寻找一种方法来做getc()或gets()或任何不回应终端的方法。 我看到了kbhit(),但这似乎不是ANSI的一部分。 理想情况下,我喜欢看起来像的代码

char s[100]; no_echo_gets(s); /* Won't echo to screen while being typed */ printf("%s\n", s); 

有没有人知道一个良好的ANSI兼容方式来做到这一点?

您无法使用ANSI C以跨平台方式执行此操作。您必须使用某些特定于操作系统的代码,或使用诸如ncurses之类的库。

对于类UNIX系统,您希望使用ECHO标志…

 #include  ... struct termios t; tcgetattr(fd, &t); t.c_lflag &= ~ECHO; tcsetattr(fd, TCSANOW, &t); ... 

getpass命令出现在Linux中。 但你可以制作一个更漂亮的版本,单独的系统回声不会消除对enter命令的需要,而击倒缓冲并不会在数据输入后杀死carraige返回的产生。 将两者结合起来可以很好地逼近一个安静的入口。 您可以添加星号以提供秘密条目外观,因此以下是两个建议的组合:

  #include  #include  #include  int getche(void); int main(int argc, char **argv){ int i=0; char d,c='h',s[6]; printf("Enter five secret letters\n"); s[5]='\0'; //Set string terminator for string five letters long do{ d=getche();//Fake getche command silently digests each character printf("*"); s[i++]=d;} while (i<5); printf("\nThank you!!\n Now enter one more letter.\n"); c=getchar(); printf("You just typed %c,\nbut the last letter of your secret string was %c\n",c,d); printf("Your secret string was: %s\n",s); return 0; } /* reads from keypress, echoes */ int getche(void) { struct termios oldattr, newattr; int ch; tcgetattr( STDIN_FILENO, &oldattr ); newattr = oldattr; newattr.c_lflag &= ~( ICANON | ECHO);\\knock down keybuffer tcsetattr( STDIN_FILENO, TCSANOW, &newattr ); system("stty -echo");\\shell out to kill echo ch = getchar(); system("stty echo"); tcsetattr( STDIN_FILENO, TCSANOW, &oldattr ); return ch; } 

由于您的任务非常基础,如果您很幸运,您的系统将具有getpass()函数:

 char * getpass(const char *prompt); 

如果您不想要提示,请执行以下操作:

 char *s = getpass(""); if (s != NULL) printf("Your password was %s!\n", s); 

与所有与回声和缓冲相关的C函数一样, getpass()是非标准的,但在Mac OS X上可能存在,可能是Linux,并且列在GNU C库中,所以它可能存在于任何使用glibc的系统上。

如前所述,ANSI和ISO标准没有指定在没有回显的情况下读取输入的标准方法,也没有指定读取无缓冲的输入(即一次在字符上)。

也许你可以尝试这样:

 #include char s[100]; system("stty -echo"); scanf("%s",s); /* Won't echo to screen while being typed */ system("stty echo"); printf("You have entered:"); printf("%s\n", s); return 0; } 

在Linux中,系统函数“stty -echo”是键入没有回声的sth。 希望这会有所帮助。

没有一个; ANSI C和ISO C ++都没有这样的东西。

这取决于您的环境,而不是语言提供的内容。 如果您打算进行广泛的字符模式I / O,您可能会查看像curses这样的库。 否则,您必须手动操作终端或Windows控制台。

ANSI和ISO C没有定义此function,但是大多数C编译器都有getch()或接近变化。

您需要为您正在使用的每个编译器执行预处理器定义,该编译器具有不同的库和函数。 虽然您可能认为这很烦人,但这并不困难。

-亚当