2010-04-14 8 views
10

Je suis conscient qu'il n'est pas possible d'écho le * pendant que vous tapez dans ANSI C standard. Mais est-il un moyen de ne rien afficher lorsque quelqu'un tape son mot de passe dans la console. Ce que je veux dire, c'est comme les invites sudo dans un terminal Unix/Linux. Comme si vous tapez la commande: sudo cp /etc/somefile ~/somedir. Vous êtes généralement invité à entrer le mot de passe root. Et pendant que vous le tapez, le terminal n'affiche rien. Cet effet est-il possible en C? Si c'est le cas, comment?Entrez le mot de passe dans C

+0

Qu'est-ce qu'il n'est pas possible d'afficher "*"? printf ("*"); le fera. –

+0

@Peter K .: Je crois qu'il fait référence au fait que toutes les fonctions d'entrée standard font écho à la console. Bien sûr, vous pouvez imprimer *, mais le caractère que l'utilisateur a tapé est déjà là. –

+0

copie possible http://stackoverflow.com/questions/1196418/getting-a-password-in-c-without-using-getpass-3 –

Répondre

8

La fonction que vous recherchez est: getpass(). Vous remarquerez, cependant, qu'il est marqué comme "LEGACY". Bien que cela ne va nulle part, la fonction ne permet pas de spécifier la taille du tampon d'entrée, ce qui en fait une très bonne interface. Comme Jefromi l'a noté, le manuel de glibc fournit portable example code for implementing getpass from scratch d'une manière qui permet une taille d'entrée arbitraire (et n'est pas LEGACY).

+0

Ils devraient fournir 'getnpass()' de sorte que tous les programmeurs n'ont pas besoin de réinventer la roue ... – Calmarius

0

* Ce n'est pas ANSI C (Merci Billy) Extrait

Vous pouvez détecter avec _kbhit keypress(), puis obtenir la valeur à l'aide _getch(). Les deux fonctions ne répercutent pas le contenu à l'écran.

#include <conio.h>   //For keyboard events 
#include <stdio.h>   //Include this or iostream 
#include <locale>   
int main() 
{ 
    bool bContinue = true; 
    char szBuffer[255] = {0}; 
    unsigned int nbufIndex = 0; 
    while (bContinue) 
    { 
     if (_kbhit()) 
     { 
      szBuffer[nbufIndex] = _getch(); 
      if (szBuffer[nbufIndex] == 0xD) 
      { 
       bContinue = false; 
      } 
      else 
      { 
       ++nbufIndex; 
       printf("*"); 
      } 
     } 
    } 
    printf("\n%s\n", szBuffer); 
    return 0; 
} 
+0

Notez que ce n'est pas ANSI C. –

+1

Je ne pense pas que 'conio.h' soit susceptible d'être disponible si vous ' re compiler sous UNIX ou Linux. –

0

méthode du pauvre homme de le faire est de lire le caractère d'entrée utilisateur par caractère, et après que chaque caractère est reçu, imprimez un caractère de retour arrière suivi de *. La sortie est techniquement envoyée à la console, mais elle est immédiatement effacée et remplacée par un astérisque (souvent avant même que cette image ne soit dessinée sur l'écran). Notez que ce n'est pas vraiment une méthode sécurisée et qu'il existe plusieurs failles de sécurité, mais pour les applications de basse sécurité à faible technologie, cela fonctionne.

Questions connexes