Chức Năng Nhập và Xuất trong C
Xin chào các bạn 未来程序员 (future programmers)! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới Nhập và Xuất (I/O) trong lập trình C. Như một người giáo viên máy tính gần gũi, tôi ở đây để hướng dẫn các bạn qua khía cạnh quan trọng này của mã hóa. Vậy, hãy chuẩn bị sẵn sàng các блокноты ảo của mình, và chúng ta cùng bắt đầu!
Các Tệp Tiêu Chuẩn trong C
Trước khi chúng ta bắt đầu gõ phím, hãy nói về một điều cơ bản: các tệp tiêu chuẩn trong C. Bạn thấy đấy, khi bạn chạy một chương trình C, nó tự động mở ba tệp cho bạn. Đó giống như có ba trợ lý giúp đỡ bạn quản lý giao tiếp của chương trình với thế giới bên ngoài.
- stdin (Standard Input)
- stdout (Standard Output)
- stderr (Standard Error)
Những tệp này là cổng giao tiếp của chương trình với người dùng và hệ thống. Hãy tưởng tượng stdin là tai của chương trình, stdout là miệng, và stderr là cách nó la hét khi có điều gì đó sai sót. Đ趣 không?
Các Loại Chức Năng Nhập và Xuất
Bây giờ, hãy nói về các công cụ chúng ta sử dụng để tương tác với những tệp này. Trong C, chúng ta có hai loại chức năng I/O chính:
- Chức Năng I/O Không Định Dạng
- Chức Năng I/O Định Dạng
Các chức năng không định dạng xử lý dữ liệu thô, trong khi các chức năng định dạng cho phép chúng ta chỉ định định dạng dữ liệu của mình. Đó giống như sự khác biệt giữa việc ăn gạo trắng (không định dạng) và một bữa ăn cao cấp được trang trí đẹp mắt (định dạng). Cả hai đều hoàn thành công việc, nhưng một trong hai cho phép bạn kiểm soát hơn về phần trình bày!
Chức Năng Nhập và Xuất Chữ Không Định Dạng: getchar() và putchar()
Hãy bắt đầu đơn giản với các chức năng I/O chữ không định dạng. Hãy gặp hai chức năng đầu tiên của chúng ta: getchar()
và putchar()
.
getchar()
getchar()
đọc một ký tự duy nhất từ đầu vào tiêu chuẩn (thường là bàn phím). Nó giống như một người lắng nghe kiên nhẫn chờ đợi bạn gõ một ký tự.
#include <stdio.h>
int main() {
char ch;
printf("Nhập một ký tự: ");
ch = getchar();
printf("Bạn đã nhập: ");
putchar(ch);
return 0;
}
Trong ví dụ này, getchar()
chờ đợi bạn gõ một ký tự và lưu trữ nó trong ch
. Đó là đơn giản, nhưng lại rất mạnh mẽ!
putchar()
putchar()
là đối tác của getchar()
. Nó xuất một ký tự duy nhất ra đầu ra tiêu chuẩn (thường là màn hình). Nó giống như một người loan báo công khai thông báo một chữ cái tại một thời điểm.
#include <stdio.h>
int main() {
char ch = 'A';
printf("In một ký tự: ");
putchar(ch);
return 0;
}
Ở đây, putchar(ch)
hiển thị ký tự 'A' trên màn hình của bạn. Đơn giản và hiệu quả!
Chức Năng Nhập và Xuất Chuỗi Định Dạng: gets(), fgets(), puts(), và fputs()
Bây giờ, hãy nâng cấp và nói về I/O chuỗi. Các chức năng này xử lý toàn bộ chuỗi, không chỉ đơn ký tự.
gets() và fgets()
gets()
đọc một dòng từ stdin vào một bộ nhớ đệm. Tuy nhiên, nó được coi là không an toàn vì nó không kiểm tra tình trạng tràn bộ nhớ đệm. Đó là lý do tại sao chúng ta ưu tiên sử dụng người anh em an toàn hơn của nó, fgets()
.
#include <stdio.h>
int main() {
char name[50];
printf("Nhập tên của bạn: ");
fgets(name, sizeof(name), stdin);
printf("Xin chào, %s", name);
return 0;
}
Trong ví dụ này, fgets()
đọc một dòng văn bản (tên của bạn) vào mảng name
. Nó an toàn hơn vì chúng ta chỉ định số lượng ký tự tối đa để đọc.
puts() và fputs()
puts()
ghi một chuỗi vào stdout và thêm một ký tự xuống dòng. Đối tác của nó trong luồng tệp là fputs()
.
#include <stdio.h>
int main() {
char greeting[] = "Xin chào, Thế giới!";
puts(greeting); // Xuất: Xin chào, Thế giới! (với ký tự xuống dòng)
fputs(greeting, stdout); // Xuất: Xin chào, Thế giới! (không có ký tự xuống dòng)
return 0;
}
puts()
tự động thêm một ký tự xuống dòng, trong khi fputs()
cho bạn nhiều kiểm soát hơn.
Chức Năng Nhập và Xuất Định Dạng: scanf() và printf()
Bây giờ chúng ta đến với các chức năng I/O mạnh mẽ: scanf()
và printf()
. Các chức năng này giống như dao đa năng của I/O - linh hoạt và mạnh mẽ.
scanf()
scanf()
đọc dữ liệu định dạng từ stdin. Nó giống như một người kén chọn chỉ chấp nhận thức ăn được chuẩn bị chính xác như yêu cầu.
#include <stdio.h>
int main() {
int age;
float height;
printf("Nhập tuổi và chiều cao của bạn: ");
scanf("%d %f", &age, &height);
printf("Bạn %d tuổi và %.2f mét cao.\n", age, height);
return 0;
}
Ở đây, scanf()
đọc một số nguyên (%d
) và một số float (%f
) từ đầu vào. Ký tự &
trước age
và height
rất quan trọng - nó cho biết scanf()
nơi để lưu trữ các giá trị.
printf()
printf()
là đối tác đầu ra của scanf()
. Nó giống như một người kể chuyện tài ba, dệt dữ liệu của bạn thành các chuỗi định dạng đẹp mắt.
#include <stdio.h>
int main() {
int apples = 5;
float price = 0.75;
printf("Tôi có %d quả táo, mỗi quả %.2f đô la.\n", apples, price);
return 0;
}
Trong ví dụ này, printf()
định dạng dữ liệu của chúng ta thành một câu rõ ràng.
Các Chỉ Định Định Dạng trong C
Các chỉ định định dạng là bí quyết làm cho scanf()
và printf()
mạnh mẽ. Chúng giống như hướng dẫn cho các chức năng này cách hiểu hoặc trình bày dữ liệu.
Dưới đây là bảng các chỉ định định dạng phổ biến:
Chỉ Định | Loại Dữ Liệu |
---|---|
%d | Số nguyên |
%f | Float |
%c | Ký tự |
%s | Chuỗi |
%lf | Double |
%x | Hexadecimal |
%o | Octal |
%p | Pointer |
Nhớ rằng bạn có thể thay đổi các chỉ định này. Ví dụ, %.2f
in một số float với 2 chữ số thập phân, và %5d
in một số nguyên trong trường rộng 5 ký tự.
Và thế là bạn đã có nó, các bạn! Chúng ta đã bao gồm các основы của Nhập và Xuất trong C. Nhớ rằng, thực hành là chìa khóa của sự hoàn hảo. Vậy, hãy ra ngoài và bắt đầu mã hóa! Ai biết đâu? Có lẽ bạn sẽ tạo ra điều lớn lao tiếp theo trong công nghệ. Đến gặp lại lần sau, chúc các bạn mã hóa vui vẻ!
Credits: Image by storyset