Hãy dừng việc sử dụng fflush(stdin) để xóa dòng nhập

Manh

March 16, 2016

C++

1. Hiện thực

– Lập trình C được giảng dạy ở Việt Nam một cách rất “hỗn tạp”

– Vì chỉ được coi là một môn học “nhập môn” nên giảng dạy khá “cẩu thả”

– C không xứng đáng là để dạy nhập môn, hãy dạy nó chuyên sâu: Vì sao lại khiến một người chưa biết nhiều về lập trình phải đau đầu về con trỏ, cấp phát động, … để rồi họ không có thời gian tập trung vào tư duy lập trình ngay từ lúc đầu? Hãy dạy python, java, javascript, … cho người mới học lập trình thay vì C.

2. Hỗn tạp

Chúng ta được học một thứ ngôn ngữ C pha thêm C++, chỉ đến khi bạn phải làm việc với ngôn ngữ C thực sự (ví dụ sau này đi làm) bạn mới nhận ra điều đó.

a. Lưu tên file thành .cpp sẽ khiến IDE gọi trình dịch của C++

– Ngôn ngữ C không có truyền bằng tham chiếu, nó chỉ có truyền tham trị và truyền con trỏ.

– struct của C khác với C++. Ở C++ struct chính là class, struct của C hoàn toàn khác, nó chỉ trùng tên để tương thích với C. Ngôn ngữ C không có class.

Mình từng thấy có bạn cho luôn cả function vào struct và bảo đó là code C, chạy vèo vèo.

… và có vài thứ khác nữa, bạn sẽ cứ nghiễm nhiên dùng như không có chuyện gì xảy ra và quen với nó – tất nhiên sẽ may mắn cho bạn nếu không bao giờ gặp lại C sau này.

Tốt nhất là bạn nên biết mình đang code cái gì, hơn là viết code thụ động.

b. Tài liệu lập trình C tiếng việt:

– Quá cũ, không được ai kiểm chứng nhưng được share tràn lan

– Nhiều code ví dụ chỉ chạy được trên trình dịch cũ

– Được viết ra bởi “kinh nghiệm” của chính người viết, không theo tiêu chuẩn của ngôn ngữ C

– Khái niệm Standard không hề được nhắc đến.

c. Bài tập :

Bị phức tạp hóa để cố tình khiến người học phải suy nghĩ, nhưng kết quả đạt được của sự phức tạp hóa đó thì chẳng có gì cả. Lập trình C có nhiều trò khá dị, nhưng quan trọng học nó để làm gì và có ích gì cho tư duy lập trình, hay chỉ đơn giản là nó “hay và lạ”.

3. Standard

Tầm quan trọng của “tiêu chuẩn”:

– Được trình bày rõ ràng, có thể tra cứu.

– Sử dụng tốt hơn vì bạn sẽ biết được nó sẽ hoạt động như thế nào, khác với nghe người ta truyền miệng về các chức năng, các hàm nhưng vẫn khó áp dụng vì trình dịch của bạn không hỗ trợ, thay vì đó bạn sẽ luôn biết chắc chắn hành vi của một lệnh Standard.

Vậy nên, hãy học theo “tiêu chuẩn”, và biết được cái nào chuẩn, cái nào không theo chuẩn để tránh bị đau đầu về những thứ không cần thiết phải đau đầu khi lập trình C và cũng như với các ngôn ngữ khác. Standard là thứ phải nghiên cứu đầu tiên và phải thường tra cứu để sử dụng.

Tương tự với Java, nếu không quen với việc học theo Standard, bạn sẽ chẳng biết mình đang học Java gì và sử dụng các công cụ, thư viện Java thì nó là Java gì.

(Ví dụ bạn dùng Java 8 cho Android trước API N).

Mọi ngôn ngữ đều có Standard.

4. fflush(stdin) không được định nghĩa trong thư viện C Standard

http://en.cppreference.com/w/c/io/fflush

(Trang web này được các người lập trình cùng nhau xây dựng để tra cứu, dựa trên các tài liệu chính thống của ngôn ngữ C/C++ – Community Wiki)

Đối với dòng nhập, hành vi của fflush là không cố định, và nó sẽ hoàn toàn phụ thuộc vào trình biên dịch.

Mình sẽ không thuyết phục người đọc rằng fflush(stdin) là sai như thế nào và tại sao không nên dùng nó.

fflush(stdin) chỉ là một ví dụ điển hình trong hàng loạt những vấn đề chưa hay đối với người học lập trình C, một bài viết không thể chỉ ra hết được.

Ở trong bài viết này mình nói lên quan điểm về Standard, về ngôn ngữ C (bởi nó hay được dạy nhập môn) và thói quen tra cứu Standard liên quan đến việc học lập trình như thế nào, mà không chỉ nói riêng về lập trình C.

Cuối cùng, lựa chọn dùng fflush(stdin) hay không thì cũng không thể cưỡng ép được, tùy vào những gì bạn đang thấy.

Ít nhất, mong rằng bạn sẽ thử tìm hiểu Standard là gì.

Bài viết tham khảo:

cprogramming.com: Why fflush(stdin) is wrong?

fflush(stdin) Replacement

Comments

comments

Related Posts

Modern C++: Functors

Manh

March 11, 2016

C++

1. Functor là gì? Nếu như là một fan trung thành của C++ STL (Standard Template Library), bạn sẽ bắt gặp functor rất nhiều. Ví dụ trong đoạn code sau: #include <iostream> #include <vector> #include <algorithm>   void increment(int& i) { ++i; std::cout << i << ' '; }   int main() { std::vector<int> v […]

Read More

Lập trình giao diện console: NCurses Form

Manh

December 22, 2015

C++

Trong bài hôm nay chúng ta sẽ add thêm hành động vào Menu, khi được lựa chọn, chương trình sẽ tạo ra một form nhập dữ liệu.   1. Color Attributes Chúng ta đã biết rằng một ứng dụng NCurses có thể sử dụng màu hoặc không. Vậy có thể thay đổi các màu hiển […]

Read More