-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()ます。ポール R 氏に感謝します。

また、

  1. getchar()値を返しintます。あなたはそれをに集めようとしていcharます。場合によっては (たとえば、EOF) 戻り値がに収まらないことがありcharます。chタイプに変更int
  2. 入力のループ内に nindexのバインドされていないインクリメントがありwhile()ます。入力が長すぎると、 のバッファ オーバーフローが発生する可能性がありpasswordます。常にインデックスを制限します。
  3. 文字ごとの入力の取得が終了したらnull、配列を -terminate して、文字列として使用します。

注:getchar()入力された文字がエコー バックされます。に置き換えません*。入力を非表示にする (つまり、エコー バックしない) には、次のようにします。

  1. ncursesライブラリを使用します。echo()amdnoecho()とともに、initscr()それを達成するのに役立ちます。これは、目的を達成するための推奨される方法です。

  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 に答える