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.
Cách nhập mật khẩu
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
Cảm ơn bạn nhiều. Cộng đồng cần những người như bạn
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.
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
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
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
thanks Dark. Hades…
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
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 = "";
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
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
ok, mình đã hiểu. Làm phiền bạn nhiều r.
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