-1

我需要让这项工作在 Linux 上运行,我知道 conio.h 不适用于 Linux,主要问题是 getch() 函数。我尝试使用像 curses.h 这样的另一个库,但仍然出现很多错误。出于安全原因,它需要用户输入密码并将其转换为****。

旧代码:

#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;
}
4

3 回答 3

3

一些开始的指针

  1. 消除conio.h
  2. 替换getch()getchar()
  3. void main()int main(void).
  4. 删除clrscr(). 感谢 Paul R 先生。

另请注意,

  1. getchar()返回一个int值。您正在尝试将其收集到char. 有时,(例如,EOF)返回值可能不适合char. 更改chint类型。
  2. 您有一个未绑定的 nindex 内部while()循环增量用于输入。过长的输入会导致password. 始终限制索引。
  3. 完成逐个字符的输入后,-null终止数组,将其用作字符串。

注意:getchar()将回显输入的字符。它不会用*. 要隐藏输入(即不显),您可以这样做

  1. 使用ncurses图书馆。echo()amd noecho()withinitscr()可以帮助您实现这一目标。这是实现您想要的目标的首选方式。

  2. [过时的方式]使用getpass()from unistd.h.

于 2015-07-17T09:28:25.193 回答
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;
}
于 2015-07-17T09:46:45.247 回答
0

使用 -cpp 调用编译器并保存输出,这将显示每个引用的头文件,隐式和显式。很多时候,这会让您在不同平台上找到替代标头。

于 2015-07-17T21:11:12.773 回答