【问题标题】:scanf() without displaying on screenscanf() 不显示在屏幕上
【发布时间】:2014-02-25 19:49:08
【问题描述】:

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);
}

【问题讨论】:

标签: c linux scanf getch


【解决方案1】:

不是scanf 在屏幕上显示字符,而是终端仿真在回显您键入的字符。您可以使用您建议的技术禁用它(或使用库来隐藏它),但再多摆弄其他函数来阅读 STDIN 也无济于事。

【讨论】:

    【解决方案2】:

    getpass 函数不可靠,并且在其联机帮助页中有“过时,避免”警告;但是,它基本上可以满足您的需求。 (我怀疑它已经过时了,因为它不可重入并且不允许输入 任意长 的密码,这在当今很重要。)readpassphrase 函数的可移植性更差,并且有自己的怪癖(例如,不应使用大多数标志),但确实可以让您控制读取缓冲区的大小。而且 gnulib 有getpass-gnu,它遵循getpass 调用约定,但返回一个malloced 字符串而不是指向静态存储的指针,从而解决了原始getpass 的主要问题。

    在一个严肃的程序中,我可能会从 gnulib getpass 开始,重命名函数(以​​避免与 libc 的潜在冲突),然后删除一些更可疑的功能(比如在 /dev/tty 不可用时从标准输入读取- 正确的做法是努力失败,但提供一些其他方式将密码短语输入程序以供脚本使用)。或者,如果可行,我会围绕 SSH 密钥而不是密码构建程序。

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多