scanf()没有在屏幕上显示

时间:2014-02-25 19:49:08

标签: c linux scanf getch

Linux上的C中是否有任何功能允许等待用户输入而不在终端上显示他正在键入的内容? (比如在Linux上的终端上输入密码时)

我找到了getch(),但它不适用于Linux ...... :(

我发现了这个但是太复杂了......:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>

int     main(void)
{
   char buffer[100];
   struct termios infos;
   int   size;

   if (tcgetattr(STDIN_FILENO, &infos) == -1)                                                                                                  
   {
        fprintf(stderr, "Erreur tcgetattr.\n");
        return (EXIT_FAILURE);
   }
   infos.c_lflag &= ~ECHO;                                                                                                                                 

   if (tcsetattr(STDIN_FILENO, TCSANOW, &infos) == -1)                                                                                        
   {
        fprintf(stderr, "Erreur tcsetattr.\n");
        return (EXIT_FAILURE);
   }
   if ((size = read(STDIN_FILENO, buffer, sizeof(char) * 100)) == -1)                                            
   {
        fprintf(stderr, "Erreur durant la lecture.\n");
        return (EXIT_FAILURE);
   }
   buffer[size - 1] = '\0';
   printf("le buffer contient [%s]\n", buffer);                                                                                                 
   return (EXIT_SUCCESS);
}

2 个答案:

答案 0 :(得分:3)

显示屏幕上的字符不是scanf,而是终端模拟,它会回显您键入的字符。您可以使用您建议的技术禁用它(或使用库来隐藏它),但是没有其他功能来阅读STDIN会有所帮助。

答案 1 :(得分:1)

getpass函数不可靠,并且在其联机帮助页中有“过时,避免”的警告;然而,它基本上是你想要的。 (我怀疑它已被淘汰,因为它不是可重入的,并且不允许输入任意长的密码,这在当今很重要。)readpassphrase功能更不便携有自己的怪癖(例如,不应该使用大多数标志)但是可以让你控制读缓冲区的大小。 gnulib有getpass-gnu,它遵守getpass调用约定但返回malloc ed字符串而不是指向静态存储的指针,从而解决了原始{{1}的主要问题}。

在一个严肃的程序中,我可能会从gnulib getpass开始,重命名该函数(以避免与libc的潜在冲突),然后破解一些更可疑的功能(例如,如果{{1,则从stdin读取)不可用 - 正确的事情是努力失败,但提供一些其他方法来获取密码进入程序以供脚本使用)。或者,如果可行,我会围绕SSH密钥而不是密码构建程序。