01/10/2018, 10:14

Hỏi về cách thông báo nhập lỗi khi nhập quá 1 kí tự

Em hiên đang làm 1 bài về nhập kí tự nếu chữ thường sẽ in hoa và chữ hoa sẽ in thường, về bước này thì em đã làm được, em đang dính ở phần điều kiện, nếu em yêu cầu người dùng nhập 1 kí tự thì lỡ người dùng nhập 2 kí tự trở sẽ thông báo nhập sai, nhưng em không biết điêu kiện ây như thê nào. Mong mấy anh chị có kinh nghiệm chỉ dạy em phần này!. Em hy vọng mấy anh chị không nên đưa bài giải, chỉ nên giải thích cho em nó hoạt động như thế nào thôi ạ! Chúc anh chị có ngày tốt đẹp!

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

Bạn cho người dùng nhập vào char * rồi đếm

Rhen Su viết 12:20 ngày 01/10/2018

ví dụ mình ghi:

char * chucai;

printf(“Nhap chu cai );
scanf(”%c", &chucai);

nhu vay hả bạn?

Trần Hoàn viết 12:23 ngày 01/10/2018

Code này là C++ thì phải…
Đối với char* thì bạn không dùng scanf được, thay vào đó dùng getline()
Mà mình thấy cách tốt nhất để thu được 1 ký tự nhập vào từ bàn phím là dùng getch()

Rhen Su viết 12:18 ngày 01/10/2018

Minh đang học C chưa học C++. Cho mình hỏi lệnh Char* là con trỏ đúng không? Mình chưa học tới con trỏ, chỉ dùng mới học tới if else thôi

Trần Hoàn viết 12:18 ngày 01/10/2018

Thứ nhất, code của bạn là code C++, không phải code C
Thứ 2, trong lập trình không có khái niệm “lệnh Char*”
Thứ 3, char* là một kiểu dữ liệu, và scanf %c thì chỉ dùng để nhập ký tự, không phải để nhập mảng ký tự

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

char * chucai;

printf(“Nhap chu cai );
scanf(”%c", &chucai);

nhu vay hả bạn?

cái này là code C chứ C++ cái gì??

thích đơn giản thì cứ phang

char input_line[100];
fgets(input_line, 100, stdin);

rồi xử lý dòng input nhập vào:

//input_line nhập vào có thêm ký tự '\n' sau cùng, nên kiểm tra như vầy cho chắc
int is_one_char_input = strlen(input_line)==2 && input_line[1]=='\n';
if (!is_one_char_input)
{
    //nhập nhiều hơn 1 ký tự
}

ai nhập nhiều hơn 98 ký tự 1 dòng thì cái input_line trên chứa ko nổi, có thể phải cần xóa mấy ký tự còn thừa…

rảnh háng thì viết 1 cái struct chứa char * ptrint length rồi viết hàm tăng độ dài cho chuỗi tùy ý như C++ string vào…

Phạm Minh Anh Hữu viết 12:23 ngày 01/10/2018

Đây là C mà đâu phải C++
Bạn có thể dùng char * như 1 mảng ý, rồi điếm số kí tự của mảng đó

Rhen Su viết 12:16 ngày 01/10/2018

Cho em hỏi sự khác nhau 3 cái : scanf(), fgets() và gets()? và dòng “stdin” mình dùng để làm gì ạ?
Vậy nếu em chỉ muốn người dùng nhâp duy nhất 1 kí tự thì em sẽ làm:

char input_line[1];
fgets(input_line, 1, stdin);

Trần Hoàn viết 12:29 ngày 01/10/2018

C thì không có & chứ nhỉ? Hay mình nhầm?

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

scanf đọc theo format, có thể đọc int, float, char, 1 từ, 1 dòng v.v…, chỉ đọc từ stdin
fgets chỉ đọc 1 dòng, nhưng có thể đọc từ stdin hoặc từ file
gets chỉ đọc 1 dòng và chỉ đọc từ stdin

gets, scanf nếu đọc 1 dòng mà quá nhiều ký tự, quá sức chứa của mảng ký tự truyền vào có thể chứa được thì gây lỗi. fgets cho phép giới hạn số ký tự trên 1 dòng, nên dùng fgets an toàn hơn. Nhược điểm là fgets lại chép luôn ký tự xuống dòng vào output mà ko bỏ qua như gets.

stdin là input nhập vào từ bàn phím hoặc từ pipe, hiểu đơn giản thì cứ cho nó là nhập từ bàn phím đi.

nhập đúng 1 ký tự ko phải khoảng trắng thì xài char c; scanf("%c", &c); cho khỏe. fgets kiểu kia phải chừa 1 chỗ cho ký tự NULL sau cùng nên size là 2, ngoài ra còn có thể phải chứa thêm ký tự xuống dòng nên kích thước tối thiểu phải là 3… Có hàm fgetc hoặc getchar có thể đọc 1 ký tự nhưng nó có thể là khoảng trắng. Xài scanf cho lành.

Rhen Su viết 12:30 ngày 01/10/2018

C++ là cout và cin. Còn C thì printf() và scanf()

Rhen Su viết 12:30 ngày 01/10/2018

Dạ em cảm ơn anh, em sẽ chạy thử đoạn mã code đây xem

*grab popcorn* viết 12:27 ngày 01/10/2018

& = reference operator ( = lấy địa chỉ của biến)

  • = dereference operator. (= lấy giá trị của ô nhớ đang được trỏ tới)
    2 toán tử trên có từ C rồi.

Tuy nhiên C++ overload cái & để tạo ra reference variable và giúp né khỏi con quái vật pointer.
Nên thấy ntn là đảm bảo code viết bằng C++, không ít cũng nhiều :~

int swap(int &a, int &b) {
 ...
}

hoặc int &a = b;

int *a = &b; //C và C++ đều có

http://en.cppreference.com/w/cpp/language/reference

rogp10 viết 12:24 ngày 01/10/2018

Có getchar() mà ko cần scanf.

Tuy nhiên C++ overload cái & để tạo ra reference variable và giúp né khỏi con quái vật pointer.

Thực ra tham chiếu được sinh ra để hiện thực overload.

*grab popcorn* viết 12:22 ngày 01/10/2018

Thật à anh rogp10 :? (A có source nào nói không? Tại ý trên em tự nghiệm ra thôi )
Do vài lần màu mè disasm ra xem thì thấy nó hoạt động giống (gần như) y chóc pointer nên tưởng đẻ ra để diệt khẩu thằng pointer (mặc dù là ko tận gốc đc) =))

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

Tác giả của C++ nói vậy http://www.stroustrup.com/bs_faq2.html#pointers-and-references

Rhen Su viết 12:17 ngày 01/10/2018

Em chưa học tới con trỏ nhưng danh của nó đã lan ra nổi tiếng lắm. cũng khá mông lung:))

Bài liên quan
0