在此功能中,如果用户想要使用该功能,那么它将要求输入密码,即 crackneedit 。当用户输入密码时,它将被打印在屏幕上
所以我希望每当有人输入密码时,都会以*(星号)打印。我应该使用哪种技巧?
int pvote()
{
int check;
char *str = "crackneedit";
char pass[11];
printf("Enter your password: ");
scanf("%s",pass);
check = strcmp(pass,str);
if (check == 0)
{
printf("\nVote recorded according to parties are:\n");
printf("PARTY VOTE\n\n");
printf("BJP %d\n",b);
printf("CONGRESS %d\n",c);
printf("AAP %d\n",a);
printf("OTHER %d\n",o);
getch();
return(0);
}
printf("\nACCESS DENIED\n");
return(0);
}
答案 0 :(得分:1)
你应该使用的技巧是告诉操作系统停止回显键盘输入,而是自己回显每个角色。
这是您的操作系统通常处理键盘输入,直到输入整行文本,在屏幕上回显这些字符;然后将输入的整行输入发送到您的应用程序。您需要进行适当的系统调用以关闭已处理的键盘输入,并让操作系统将每个键入的字符发送到您的进程(包括光标键,回车键等)。
这样做的详细信息完全取决于您的操作系统。由于您忽略了提及您正在使用的操作系统,因此无法提供进一步的建议。
我还要提一下,你需要在你的应用程序中做更多的事情。例如,您无法使用scanf()。您必须编写代码来处理每个键入的字符,一次一个,手动回显每个字符;自己处理退格,构建字符缓冲区等...
答案 1 :(得分:1)
如果我没错,你可以使用termcaps
。
每当您检测到(例如read
)输入时,请将其存储在代码中的char *
中,然后在该字词上打印*
。
这是最终版本:
#include <unistd.h>
#include <termios.h>
#include <stdio.h>
int getch()
{
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return ch;
}
int main(int argc, char **argv)
{
int c;
char ch[20];
int i = 0;
printf("What's your password ?(20 char max.)\n");
while ((c = getch()) != '\n')
{
printf("*");
ch[i++] = c;
}
ch[i] = '\0';
printf("\nYour password is : [%s]\n", ch);
return 0;
}
示例:
#include <unistd.h>
#include <termios.h>
#include <stdio.h>
int getch()
{
struct termios oldtc, newtc;
int ch;
tcgetattr(STDIN_FILENO, &oldtc);
newtc = oldtc;
newtc.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newtc);
ch=getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldtc);
return ch;
}
int main(int argc, char **argv)
{
int ch;
printf("What's your password ?\n");
while ((ch = getch()) != '\n') // Read 'till you'll type a newline
{
printf("*"); // Print a * instead of what you'll type
// Need to store the ch into a char * or whatever.
}
printf("\n");
return 0;
}