Hướng dẫn nhập chuỗi c++
Trong bất cứ một ngôn ngữ lập trình nào, việc tương tác trực tiếp với máy tính là rất quan trọng và cần thiết. Một chương trình được viết ra cần có khả năng nhận dữ liệu từ người dùng và hiển thị những kết quả thu được sau tính toán. Do đó việc thành thạo trong việc nhập/xuất dữ liệu là điều không thể thiếu đối với mỗi lập trình viên. Bài viết này sẽ giúp hiểu rõ hơn về thao tác nhập/xuất dữ liệu thông qua phương tiện nhập xuất chuẩn. Show Tổng quanTrong C hay bất cứ ngôn ngữ lập trình nào khác, việc nhập, xử lý và xuất dữ liệu có thể được thực hiện theo hai cách:
Bài viết này sẽ chỉ đề cập đến Standard Input/Output. Thư viện nhập xuất chuẩn trong C là
Output với printfHàm printf trong C có nguyên mẫu của hàm (prototype) như sau: int printf(“ Trong đó, int là kiểu trả về của hàm, là giá trị đại diện cho hàm sau khi hết phạm vi của hàm. Chuỗi định dạng (Format string) có nhiệm vụ định dạng dữ liệu xuất ra màn hình. Danh sách tham số có thể bao gồm biến, hằng số, biểu thức và hàm (function) và được phân cách bằng dấu “ %[flags][width][.precision][length]specifier0”. Chuỗi định dạngChuỗi định dạng phải tương ứng với danh sách tham số về số lượng, kiểu dữ liệu và thứ tự. Chuỗi định dạng luôn được đặt bên trong cặp dấu “” và bao gồm một hoặc nhiều thành phần sau:
Lệnh định dạng có cấu trúc như sau: %[flags][width][.precision][length]specifier Trong đó, %[flags][width][.precision][length]specifier3, %[flags][width][.precision][length]specifier4, %[flags][width][.precision][length]specifier5, %[flags][width][.precision][length]specifier6 là một số bổ từ tùy chọn để thay đổi đặc tả gốc cho phù hợp với mong muốn của lập trình viên. Specifier là đặc tả cho kiểu dữ liệu. Một số đặc tả thường dùng: %[flags][width][.precision][length]specifier7, %[flags][width][.precision][length]specifier8Số nguyên có dấu %[flags][width][.precision][length]specifier9Số nguyên không dấu #include0Số thực #include1Ký tự #include2Chuỗi ký tự
#include Input với scanfPrototype của hàm #include3 trong C như sau: int scanf(“ Tương tự như hàm #include4, danh sách tham số của #include3 cũng được phân cách bằng dấu “ %[flags][width][.precision][length]specifier0”. Tuy nhiên, tham số phải được truyền vào dưới dạng tham chiếu, tức truyền vào địa chỉ của biến. Tham chiếu của các kiểu dữ liệu cơ bản (primitive data type) như #include7, #include8, #include9, … là int scanf(“0 (address-of operator) cùng với tên biến. Đối với các kiểu dữ liệu dẫn xuất (ví dụ như chuỗi ký tự), tham chiếu đơn giản là tên biến. Chuỗi định dạngChuỗi định dạng của hàm int scanf(“1 có thể bao gồm những thành phần sau:
Tương tự như hàm int scanf(“3, chuỗi định dạng của int scanf(“1 có cấu trúc như sau: %[*][width][length]specifier Hiện thực ví dụ sau để nắm được cách sử dụng hàm #include3 cũng như các lệnh định dạng thông dụng: #include Một số vấn đề thường gặpKhông truyền tham chiếu vào hàm scanfĐây là lỗi thường gặp nhất. Với những project nhỏ thì lỗi này có thể phát hiện được dễ dàng. Tuy nhiên, khi làm việc với những dự án lớn, việc phát hiện và khắc phục lỗi này là cực kỳ khó khăn, vì đây không phải là lỗi trong quá trình Build nên không xác định được vị trí dòng code bị lỗi. Do đó lỗi này là đặc biệt nghiêm trọng và cần được khắc phục trong quá trình học tập. Cách khắc phục: thêm toán tử int scanf(“0 vào trước tên biến (primitive data type). Undeclared variables/Uninitialize variablesSử dụng biến mà không khai báo hoặc quên khởi tạo giá trị ban đầu cho biến. Đây không phải là lỗi nghiêm trọng và rất dễ khắc phục, tuy nhiên nó cho thấy sự thiếu cẩn thận trong công việc, hãy cố gắng khắc phục sớm. Trôi dòng lệnh khi xử lý chuỗiTrong C, dòng (stream) vào tiêu chuẩn là int scanf(“7. Các hàm như int scanf(“1, int scanf(“9, %[*][width][length]specifier0, … đều nhận dữ liệu từ int scanf(“7. Khi trên int scanf(“7 không còn dữ liệu, các hàm nhập dữ liệu sẽ yêu cầu người dùng nhập vào từ bàn phím. Các hàm trên chỉ nhận đủ dữ liệu mà chúng yêu cầu (trong trường hợp này, #include3 chỉ nhận chuỗi không có khoảng trắng), do đó một phần dữ liệu còn sót lại trên int scanf(“7, có thể là ký tự %[flags][width][.precision][length]specifier2 hoặc phần dữ liệu sau khoảng trắng. Điều này ảnh hưởng đến các hàm nhập dữ liệu phía sau. Có thể khắc phục bằng cách làm rỗng bộ đệm int scanf(“7 trước mỗi hàm nhập để đảm bảo độ chính xác của chương trình. Câu lệnh như sau: fflush(stdin); Hàm %[*][width][length]specifier7 nằm trong thư viện nên có thể dễ dàng sử dụng mà không phải include thêm thư viện khác.Error C4996 trong Visual Studio 2012 về sauTừ Visual Studio 2012 về sau, một số hàm đã được Microsoft loại bỏ hoặc thay thế bởi những hàm tương tự. Lý do là những hàm này không còn an toàn nữa. |