01/10/2018, 10:19

Cách nhập mật khẩu

Mọi người cho mình hỏi. Mình có bài tập viết chương trình nhập mật khẩu khi nhấn một phím, chờ một chút sau nó sẽ tự chuyển thành kí tự *. (Nó giống như kiểu nhập mật khẩu trong facebook vậy đó mọi người).
Cảm ơn mọi người.

Henry viết 12:25 ngày 01/10/2018

Mình không biết cú pháp C cho lắm

int main()
{
    char c = '.', password[10];
    int i = 0;
    // 13 là enter
    while(c != 13){
        if (kbhit()) # trả về True nếu phím được ấn
        {
            printf("*");
            c = getch();
            password[i] = c;
            i++;
        }
    }
    password[i] = '\0'; // Chêm kí tự kết thúc chuỗi
    printf("%s", password);
    return 0;
}

Edit: Nếu bạn muốn có thêm xóa nữa thì

        if (kbhit())
        {
            c = getch();
            if (c != 8) // 8 là backspace
            {
                printf("*");
                password[i] = c;
                i++;
            }
            else
            {
                printf("\b \b"); // ở chỗ này đưa con trỏ về để xóa đi cái *
                i--;
                password[i] = '\0';
            }
        }

Và cuối cùng muốn nó giống thật hơn nữa thì

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    printf("_______________\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
    char c = '.', password[16];
    int i = 0;
    while(c != 13){
        if (kbhit())
        {
            c = getch();
            if (c != 8)
            {
                printf("*");
                password[i] = c;
                i++;
            }
            else
            {
                printf("\b_\b");
                i--;
                password[i] = '\0';
            }
        }
    }
    password[i] = '\0';
    printf("%s", password);
    return 0;
}

Đừng copy. Coi sơ rồi tự viết lại hay hơn

Nguyễn Tiến Dũng viết 12:27 ngày 01/10/2018

Cảm ơn bạn nhiều. Cộng đồng cần những người như bạn

Nguyễn Tiến Dũng viết 12:22 ngày 01/10/2018

Bạn giải thích cho mình char c = ‘.’ mình không hiểu tại sao bạn gán cho biến c là một dấu chấm.

Henry viết 12:32 ngày 01/10/2018

Thật mình gán dấm chấm cho vui nhà vui cửa thôi. Miễn đừng gán nó thành 13 là được vì nếu là 13 thì sẽ không chạy vòng while được. Bạn có thể gán bất cứ thứ gì, thậm chí không gán

Nguyễn Tiến Dũng viết 12:28 ngày 01/10/2018

Oh. Cảm ơn bạn nha, mình đang nghiên cứu, có gì không hiểu bạn giúp mình nhé.
Con em miền núi

Dark.Hades viết 12:33 ngày 01/10/2018

Mặc định thì không cần gán(không nên gán), trong chương trình không sử dụng giá trị của nó để tính toán hay in ra, mà chỉ so sánh nên sẽ không ảnh hưởng

Nguyễn Tiến Dũng viết 12:24 ngày 01/10/2018

thanks Dark. Hades…

Henry viết 12:35 ngày 01/10/2018

Mặc định thì không cần gán(không nên gán)

Mặc dù cái này không đáng để nói đến nhưng
Tại sao lại không nên gán nhỉ? Mình nghĩ khi khai báo thì cũng nên gán cho nó một giá trị giống như việc

int n = 0;
// mặc dù không sử dụng số 0, Nhưng có lẽ nó cũng tốt hơn là giá trị rác :D  
Dark.Hades viết 12:27 ngày 01/10/2018

Giả sử chương trình (C++) thường thấy trong các bài algorithm, khi khai báo biến để nhận giá trị vào từ STDIN thì chỉ nên khai báo nó và không cần phải gán giá trị.
Eg:

Q: In ra giá trị (int) người dùng nhập vào từ bàn phím
A:
===========================
int main()
{
  int m;
  cin >> m;
  cout << m;
}

So với ngôn ngữ bậc cao (PHP, Ruby, Python,…) khi muốn dùng 1 biến ở trong lệnh rẽ nhánh/dấu {} thì phải khai báo và khởi tạo giá trị mặc định cho nó, nhìn chương trình khá là xấu:

- Ruby
string = ""
- PHP
$string = "";
Nguyễn Tiến Dũng viết 12:19 ngày 01/10/2018

còn cái này là gì vậy graktung kbhit()
thấy bạn chú thích, nhưng vẫn muốn nghe bạn giải thích rõ hơn

Henry viết 12:26 ngày 01/10/2018

Hm…Mình thấy bạn nói đúng Nhưng mà không nên gán thì thì cũng không phải đúng chứ?[quote=“HadesCass, post:11, topic:49541, full:true”]
còn cái này là gì vậy graktung kbhit()
thấy bạn chú thích, nhưng vẫn muốn nghe bạn giải thích rõ hơn
[/quote]

Nó sẽ trả về một số khác 0 nếu có một kí tự nằm ở trong keyboard buffer, nói dễ hiểu hơn là bạn nhấm một phím nào đó trên bàn phím (Một số phím như capslock hay ctrl không được hay sao thì phải). Và đương nhiên nó không đợi bạn nhấn phím đâu. Để ví dụ cho dễ hiểu

while (true)
{
     if (kbhit()) // tương đương với kbhit() != 0
     {
         break;
     }
}

vòng lặp sẽ kết thúc khi bạn nhấn một phím

Nguyễn Tiến Dũng viết 12:26 ngày 01/10/2018

ok, mình đã hiểu. Làm phiền bạn nhiều r.

Dark.Hades viết 12:25 ngày 01/10/2018

Nhưng mà không nên gán thì thì cũng không phải đúng chứ?

Mình cũng chỉ nêu ý kiến cá nhân là không nên gán nó, trường hợp maintain code nhìn nó khá là ::mất mĩ quan ::
Và ví dụ trường hợp rất không nên khởi tạo giá trị mặc định cho biến đã được khai báo:

Q: Tìm giá trị (int) nhỏ nhất mà người dùng nhập vào từ bàn phím
Bài liên quan
0