我需要让这个工作Linux,我知道conio.h不适用于Linux,主要问题是getch()函数。我尝试使用另一个像curses.h这样的lib,但我仍然遇到了很多错误。 它需要用户输入密码并出于安全原因将其转换为****。
旧代码:
#include<stdio.h>
#include<conio.h>
void main()
{
char password[25],ch;
int i;
clrscr();
puts("Enter password: ");
while(1)
{
if(i<0)
i=0;
ch=getch();
if(ch==13)
break;
if(ch==8)
{
putch('b');
putch(NULL);
putch('b');
i--;
continue;
}
password[i++]=ch;
ch='*';
putch(ch);
}
password[i]='';
printf("\nPassword enterd : %s",password);
getch();
}
根据@ SouravGhosh的回答更新了代码:
#include<stdio.h>
int main(void)
{
char password[25],ch;
int i;
//system("clear");
puts("Enter password: ");
while(1)
{
if(i<0)
i=0;
ch=getchar();
if(ch==13)
break;
if(ch==8)
{
putchar('b');
putchar('b');
i--;
continue;
}
password[i++]=ch;
ch='*';
putchar(ch);
}
password[i]=' ';
printf("\nPassword enterd : %s",password);
getchar();
return 0;
}
答案 0 :(得分:3)
使用
启动的一些指示conio.h
getch()
替换为getchar()
注意 void main()
至int main(void)
。clrscr()
。 感谢Paul R先生 另请注意,
getchar()
返回int
值。您正试图将其收集到char
。有时,(例如,EOF
)返回值可能不适合 a char
。将ch
更改为int
类型。while()
循环内有一个未绑定增量的nindex用于输入。过长的输入会导致password
的缓冲区溢出。始终限制索引。null
- 终止数组,将其用作字符串。注意:getchar()
将回显输入的chacrater。它不会用*
替换它。要隐藏输入(即,不要回显),你可以做
答案 1 :(得分:0)
如果您的终端支持这些转义码,则会在输入密码时隐藏输入。
#include <stdio.h>
void UserPW ( char *pw, size_t pwsize) {
int i = 0;
int ch = 0;
printf ( "\033[8m");//conceal typing
while ( 1) {
ch = getchar();
if ( ch == '\r' || ch == '\n' || ch == EOF) {//get characters until CR or NL
break;
}
if ( i < pwsize - 1) {//do not save pw longer than space in pw
pw[i] = ch; //longer pw can be entered but excess is ignored
pw[i + 1] = '\0';
}
i++;
}
printf ( "\033[28m");//reveal typing
printf ( "\033[1;1H\033[2J");//clear screen
}
int main ( ) {
char password[20];
printf ( "Enter your password: ");
fflush ( stdout);//prompt does not have '\n' so make sure it prints
UserPW ( password, sizeof ( password));//password array and size
printf ( "\nentered [%s]\n", password);//instead of printing you would verify the entered password
return 0;
}
答案 2 :(得分:0)
使用-cpp调用编译器并保存输出, 这将显示引用的每个头文件,隐式和显式。 很多时候,你会在不同的平台上找到替代的标题。