Theo mình biết thì nếu dùng các hàm nhập chuẩn của C thì nó chỉ dừng khi mình nhất Enter, chứ không giới hạn ký tự được.
Cách làm của mình thế này, kiểm soát các ký tự & số lượng ký tự nhập vào bằng Mã ASCII.
Nếu mã ASCII nằm trong các ký tự mình cho phép thì lấy, không thì bỏ qua, và lặp lại cho đến khi nào nhập đủ thì thôi.
Để lấy mã ASCII của 1 phím nhập vào thì mình dùng hàm getch (trong thư viện conio.h)
Ví dụ
C++ Code:
int n; n=getch(); // Nếu nhập chữ A thì khi đó n=65, vì mã ASCII của chữ A là 65
Ví dụ hàm nhập chuỗi của mình là char* NhapChuoi (const int k), trong đó k là số ký tự tối đa cho phép nhập.
Đầu tiên ta tạo & cấp phát bộ nhớ cho 1 mảng kiểu char gồm k+1 ký tự (để lưu thêm ký tự NULL kết thúc chuỗi nữa)
Để biết hiện tại chuỗi có bao nhiêu ký tự, ta khai báo biến index, ban đầu index=0.
Khai báo thêm biến n dùng để lấy mã ASCII của bàn phím.
Trong hàm ta làm những việc như sau.
- Nếu nhấn 1 ký tự hợp lệ: Thì lưu nó vào chuỗi, biến index tăng lên và xuất ký tự đó ra màn hình.
- Nếu nhấn phím BackSpace: Thì xóa 1 ký tự ở cuối chuỗi, index giảm, xóa 1 ký tự trên màn hình
- Nếu nhấn phím Enter mà index=0 (nghĩa là chưa nhâp gì mà đã nhấn enter) thì cho quay lại từ đầu
Mã nguồn thế này: Nhớ khai báo thư viện conio.h
C++ Code:
char* NhapChuoi (const int k) { char *kq=new char[k+1]; // tạo mảng int n,index=0; do { loop:; n=getch(); // lay ma ASCII if ( ( (n>='0' && n<='9') || (n>='A' && n<='Z') || (n>='a' && n<='z') || n==' ' || n=='.' ) && index<k) // Neu thuoc 0-9, A-Z, a-z hoặc dấu . hoặc khoảng trắng && chuỗi đang có ít hơn k ký tự thì cho phép { kq[index++]=n; // Lưu vào mảng } else if (n=='\b' && index>0) // Nếu nhấn dấu BackSpace mà chuỗi không rỗng { kq[--index]=0; // Xóa 1 ký tự trong chuỗi kq } if (n==13 && index==0) goto loop; // Nếu nhấn Enter mà chưa nhập gì thì k cho phép } while (n!=13); // Cứ lặp lại trong khi chưa nhập Enter kq[index]=0; // Kết thúc chuỗi return kq; }