2012-03-16 2 views
2

Есть ли способ скрыть пользовательский ввод при запросе на C? Например:Скрыть пользовательский ввод и разрешить только определенные символы

char *str = malloc(sizeof(char *)); 
printf("Enter something: "); 
scanf("%s", str);getchar(); 
printf("\nYou entered: %s", str); 

// This program would show you what you were writing something as you wrote it. 
// Is there any way to stop that? 

Другое дело, как вы можете разрешить только определенные символы? Например:

char c; 
printf("Yes or No? (y/n): "); 
scanf("%c", &c);getchar(); 
printf("\nYou entered: %c", c); 

// No matter what the user inputs, it will show up, can you restrict that only 
// showing up if y or n are entered? 
+0

Side Примечание: 'символ ул = таНос * (SizeOf (Char *));' кажется неправильным. scanf небезопасно читать строки C –

+1

Возможный дубликат [Прочитать пароль из std :: cin] (http://stackoverflow.com/questions/1413445/read-a-password-from-stdcin) (хотя OP не спрашивая о вводе пароля, принятое сообщение в связанном потоке показывает, как отключить/включить 'terminal echo') –

+0

забыл упомянуть об окружающей среде, это какая-то совместимая с posix оболочка, win console или что? Ваш терминал управляет входным буфером и афайком, нет портативного способа сделать это. – AoeAoe

ответ

0

Для полноты картины: Там нет никакого способа сделать это в С. (То есть, стандартный, обычный C без каких-либо конкретных платформ библиотек или расширений.)

Вы не указали, почему вы хотели это сделать (или на какой платформе), поэтому трудно сделать соответствующие предложения. Вы можете попробовать a console UI library или GUI library. Вы также можете попробовать библиотеки консоли вашей платформы. (Windows, Linux)

2
#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 
#include <errno.h> 
#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL) 
int set_disp_mode(int fd,int option) 
{ 
    int err; 
    struct termios term; 
    if(tcgetattr(fd,&term)==-1){ 
    perror("Cannot get the attribution of the terminal"); 
    return 1; 
    } 
    if(option) 
     term.c_lflag|=ECHOFLAGS; 
    else 
     term.c_lflag &=~ECHOFLAGS; 
    err=tcsetattr(fd,TCSAFLUSH,&term); 
    if(err==-1 && err==EINTR){ 
     perror("Cannot set the attribution of the terminal"); 
     return 1; 
    } 
    return 0; 
} 
int getpasswd(char* passwd, int size) 
{ 
    int c; 
    int n = 0; 

    printf("Please Input password:"); 

    do{ 
     c=getchar(); 
     if (c != '\n'||c!='\r'){ 
     passwd[n++] = c; 
     } 
    }while(c != '\n' && c !='\r' && n < (size - 1)); 
    passwd[n] = '\0'; 
    return n; 
} 
int main() 
{ 
    char *p,passwd[20],name[20]; 
    printf("Please Input name:"); 
    scanf("%s",name); 
    getchar(); 
    set_disp_mode(STDIN_FILENO,0); 
    getpasswd(passwd, sizeof(passwd));  
    p=passwd; 
    while(*p!='\n') 
    p++; 
    *p='\0'; 
    printf("\nYour name is: %s",name); 
    printf("\nYour passwd is: %s\n", passwd); 
    printf("Press any key continue ...\n"); 
    set_disp_mode(STDIN_FILENO,1); 
    getchar(); 
    return 0; 
} 

для Linux