scanf()不在屏幕上显示

scanf()不在屏幕上显示,c,linux,scanf,getch,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[10

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);
}
#包括
#包括
#包括
#包括
内部主(空)
{
字符缓冲区[100];
结构术语信息;
整数大小;
if(tcgetattr(标准文件号和信息)=-1)
{
fprintf(stderr,“Erreur tcgetattr.\n”);
返回(退出失败);
}
infos.clflag&=~ECHO;
if(tcsetattr(STDIN\u文件号、TCSANOW和infos)=-1)
{
fprintf(stderr,“Erreur tcsetattr.\n”);
返回(退出失败);
}
如果((大小=读取(标准文件号、缓冲区、大小(字符)*100))=-1)
{
fprintf(stderr,“杜兰特的演讲”);
返回(退出失败);
}
缓冲区[大小-1]='\0';
printf(“le缓冲区连续[%s]\n”,缓冲区);
返回(退出成功);
}

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

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

该函数不可靠地存在,并且在其手册页中有“过时,避免”警告;但是,它基本上实现了您想要的功能。(我怀疑它被淘汰了,因为它不可重入,不允许输入任意长的密码,这在今天有点重要。)该功能的可移植性甚至更低,并且有自己的怪癖(例如,大多数标志都不应该使用)但是确实允许您控制读取缓冲区的大小。gnulib具有,它遵循
getpass
调用约定,但返回
malloc
ed字符串而不是指向静态存储的指针,从而修复了原始
getpass
的主要问题

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

函数不可靠,并且具有“过时,避免”功能它的主页上有警告;但是,它基本上做了你想要的事情。(我怀疑它被淘汰了,因为它不可重入,不允许输入任意长的密码,这在今天有点重要。)该函数的可移植性更低,并且有它自己的怪癖(例如,大多数标志不应该被使用)但是确实允许您控制读取缓冲区的大小。gnulib具有,它遵循
getpass
调用约定,但返回
malloc
ed字符串而不是指向静态存储的指针,从而修复了原始
getpass
的主要问题


在一个严肃的程序中,我可能会从gnulib
getpass
开始,重命名函数(以避免与libc发生潜在冲突),然后去掉一些更可疑的特性(如在
/dev/tty
不可用时从stdin读取-正确的做法是努力失败,但提供一些其他方法将密码短语输入程序以供脚本使用)如果可行的话,我会围绕SSH密钥而不是密码来构建程序。< /P>可能的副本:问题是C++,但是它演示了如何禁用<代码> STDIN < /Cord>回声模式。为什么太复杂了?另一个选项是使用一个库,比如Curress可能的副本:问题是C++,但是它显示了如何禁用COD。e> stdinecho模式。为什么这太复杂了?另一个选择是使用类似curses的库