Bài 6 · Cơ bản · 18 phút· Cập nhật 11/06/2026
Nhập & xuất (printf/scanf)
Biên soạn bởi Nguyễn Anh Tuấn
Dùng printf và scanf: format specifier, độ rộng/precision khi in, dấu & khi đọc biến, và các lỗi nhập liệu cần nhận ra.
printf in chữ ra màn hình. Trong dấu nháy là chuỗi định dạng; những chỗ bắt đầu bằng % là “ô trống” sẽ được điền bằng các đối số phía sau - mỗi ô một giá trị đúng kiểu đã học ở bài Biến & kiểu dữ liệu - theo đúng thứ tự:
in.c
#include <stdio.h>
int main() {
int diem = 9;
char hang = 'A';
printf("Diem: %d, hang: %c\n", diem, hang);
return 0;
} Kết quả khi chạy
Diem: 9, hang: A
- ▸%d ↔ một số int, %c ↔ một ký tự, %f ↔ số thực, %s ↔ một chuỗi.
- ▸Số “%” phải khớp số đối số, đúng thứ tự.
- ▸\n trong chuỗi là “xuống dòng”.
Cách nhanh nhất để hiểu printf là nghịch thử. Đổi chuỗi định dạng và đối số dưới đây, xem nó in ra gì:
printf in ra
Diem: 8.5 / 10
Đổi chuỗi định dạng và đối số để xem printf in ra gì. %d=số nguyên, %f=số thực, %c=ký tự, %s=chuỗi, %x=hex; \n=xuống dòng; %5d=rộng 5, %.2f=2 số lẻ.
Giữa % và chữ cái, ta chèn được độ rộng và độ chính xác để in cho đẹp/thẳng cột:
canh-le.c
#include <stdio.h>
int main() {
printf("|%5d|\n", 42); // canh phai, rong 5
printf("|%-5d|\n", 42); // canh trai
printf("|%.2f|\n", 3.14159); // 2 so le
printf("|%8.2f|\n", 3.14159);// rong 8, 2 so le
return 0;
} Kết quả khi chạy
| 42| |42 | |3.14| | 3.14|
- ▸%5d: ô rộng tối thiểu 5, canh phải; %-5d: canh trái.
- ▸%.2f: 2 chữ số sau dấu phẩy; %8.2f: rộng 8 và 2 số lẻ.
- ▸Rất hợp để in bảng số cho thẳng hàng.
Ngược với printf, scanf ĐỌC dữ liệu người dùng gõ vào và cất vào biến. Điểm quan trọng nhất: phải có dấu & trước tên biến - nghĩa là “địa chỉ của biến này”, để scanf biết ghi vào đâu (chuyện địa chỉ & con trỏ sẽ học kỹ ở bài Con trỏ & địa chỉ của khoá C nâng cao):
doc.c
#include <stdio.h>
int main() {
int tuoi;
printf("Nhap tuoi: ");
scanf("%d", &tuoi); // & = "dia chi cua bien tuoi"
printf("Sang nam ban %d tuoi\n", tuoi + 1);
return 0;
} Chạy thử
- ▸Quên dấu “&” trước biến → scanf ghi nhầm chỗ, chương trình sai/crash (lỗi #1).
- ▸Sai specifier: dùng %d cho biến float (hoặc ngược lại) → đọc sai.
- ▸Đọc double thì dùng %lf trong scanf (không phải %f).
- ▸scanf trả về SỐ giá trị đọc được - kiểm tra để biết người dùng nhập hợp lệ chưa.
Nhớ kỹ dấu &
scanf("%d", &tuoi); ← đúng. Đây là lỗi người mới mắc nhiều nhất.
Câu hỏi thường gặp
printf chỉ ĐỌC giá trị của biến để in ra, nên truyền thẳng giá trị là đủ. scanf phải GHI dữ liệu người dùng nhập VÀO biến, nên nó cần biết biến đó nằm ở ĐÂU trong bộ nhớ - “&tên” nghĩa là “địa chỉ của biến”. (Địa chỉ & con trỏ sẽ học kỹ ở khoá C nâng cao.)
%d dùng cho số NGUYÊN (int). %f dùng cho số THỰC (float). Lưu ý: khi ĐỌC một double bằng scanf thì dùng %lf, nhưng khi IN thì %f là đủ cho cả float lẫn double.
Được - miễn là số đối số khớp đúng số ô %... và đúng thứ tự. Vd printf("%d + %d = %d\n", a, b, a+b);
Rất nguy hiểm: chương trình sẽ in ra rác hoặc lỗi (hành vi không xác định). Luôn đếm cho khớp số “%” với số đối số.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Vì sao scanf cần dấu & trước tên biến mà printf thì không?
- 1
In có định dạng
Dùng công cụ ở Bước 2: in ra dòng “Diem: 8.5/10” bằng
%.1f.Hoàn thành khi: Format:
Diem: %.1f/10· đối số: 8.5 → Diem: 8.5/10. - 2
Căn lề cho thẳng cột
In ba số 5, 50, 500 - mỗi số trên một dòng, canh phải trong ô rộng 5 (
%5d).Hoàn thành khi: Mỗi dòng | 5|, | 50|, | 500| (cùng canh phải, thẳng cột).
- 3
Đọc rồi tính
Viết chương trình đọc một số nguyên rồi in ra bình phương của nó.
Hoàn thành khi:
int n; scanf("%d", &n); printf("%d\n", n * n);- nhập 6 → in 36. - 4
Tìm lỗi thiếu “&”
Lệnh
scanf("%d", tuoi);bị thiếu một thứ khiến chương trình chạy sai. Sửa lại.Hoàn thành khi: Thêm “&”:
scanf("%d", &tuoi); - 5
In ở dạng hex
In số 255 ra màn hình ở dạng thập lục phân (hex).
Hoàn thành khi:
printf("%x\n", 255);→ ff. (Nối với Bài Hệ nhị phân ở khoá Máy tính.) - 6
Hỏi và chào
Viết chương trình hỏi tuổi người dùng rồi in “Sang nam ban X tuoi”.
Hoàn thành khi:
printfnhắc,scanf("%d", &tuoi), rồiprintf("...%d...\n", tuoi + 1).