2009-11-18 8 views
1

, 나는 모든 단일 문자를 표시 할 것과 사용자 유형 * (예, 당신의 암호를 입력하세요 : *****) 나는 주위를 찾고 있어요c에서 비밀번호를 마스크하는 방법은 무엇입니까? C에서

을하지만 할 수 없습니다 이것을위한 해결책을 찾으십시오. 우분투에서 일하고 있습니다. 아무도 좋은 방법을 알고 있습니까?

+1

명령 줄이나 특정 GUI에서만 사용할 수 있습니까? 예를 들어 윈도우에서 네이티브 편집 상자는 이것을 자동으로 할 수 있습니다. 명령 줄에 – justinhj

+0

을 입력하십시오. – root

+1

http://www.gnu.org/software/coreutils/manual/libc/getpass.html – sambowry

답변

2

내 코드를 참조하십시오. 내 FC9의 x86_64의 시스템에서 작동 :

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

int main(int argc, char **argv) 
{ 
     char passwd[16]; 
     char *in = passwd; 
     struct termios tty_orig; 
     char c; 
     tcgetattr(STDIN_FILENO, &tty_orig); 
     struct termios tty_work = tty_orig; 

     puts("Please input password:"); 
     tty_work.c_lflag &= ~(ECHO | ICANON); // | ISIG); 
     tty_work.c_cc[ VMIN ] = 1; 
     tty_work.c_cc[ VTIME ] = 0; 
     tcsetattr(STDIN_FILENO, TCSAFLUSH, &tty_work); 

     while (1) { 
       if (read(STDIN_FILENO, &c, sizeof c) > 0) { 
         if ('\n' == c) { 
           break; 
         } 
         *in++ = c; 
         write(STDOUT_FILENO, "*", 1); 
       } 
     } 

     tcsetattr(STDIN_FILENO, TCSAFLUSH, &tty_orig); 

     *in = '\0'; 
     fputc('\n', stdout); 

     // if you want to see the result: 
     // printf("Got password: %s\n", passwd); 

     return 0; 
} 
+0

이 코드를 사용하면 사용자가 백 스페이스를 입력하면 *로 표시됩니다. 쓰기 (STDOUT_FILENO, "*", 1)를 통해 입력 한 후에 백 스페이스를 통해 입력을 삭제할 수있는 방법이 있습니까? –

0

수동으로 수행하십시오. 예를 들어, conio에서 getch()를 사용하여 한 번에 한 문자 씩 읽은 다음 각각에 *를 인쇄하십시오.

+1

conio.h는 Windows의 헤더 파일입니다. 우분투를 사용하고 있습니다. 어떻게해야합니까? – root

+0

그러면 curses 라이브러리를 사용하는 것이 좋습니다. –

3

ncurses 라이브러리를 살펴보십시오. 그것은 매우 다양한 시스템에서 엄청난 양의 기능을 갖춘 매우 자유로운 라이브러리입니다. 나는 그것을별로 사용하지 않았기 때문에 어떤 함수를 호출하고 싶은지 정확히 알지 못하지만 documentation을 보면 원하는 것을 찾을 수있을 것입니다.

0

이 프로그램은 * 대신 문자로 넣어하는 데 사용됩니다 더 많은 질문

을 올려주세요이 하나 같은 프로그램을 사용하고는 백 스페이스를 사용 후 입력을 삭제 ^^

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

int main() 
{ 
    char a[100],c; 
    int i; 
    fflush(stdin); 
    for (i = 0 ; i<100 ; i++) 
    { 

     fflush(stdin); 
     c = getch(); 
     a[i] = c; 
     if (a[i] == '\b') 
     { 
      printf("\b \b"); 
      i-= 2; 
      continue; 
     } 
     if (a[i] == ' ' || a[i] == '\r') 
      printf(" "); 
     else 
      printf("*"); 
     if (a[i]=='\r') 
      break; 
    } 
    a[i]='\0'; 

    printf("\n%s" , a); 
} 
관련 문제