← Lập trình C cơ bản

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độ 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ử

Chương trình in Nhap tuoi: rồi chờ. Bạn gõ 15 ↵ → nó in Sang nam ban 16 tuoi.
  • 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); ← THIẾU “&”, sai!
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ố.

Là “độ rộng” và “độ chính xác”. %5d = in số trong ô rộng ít nhất 5 ký tự (canh phải). %.2f = lấy 2 chữ số sau dấu phẩy. %-5d = canh trái. Dùng để in bảng cho thẳng cột.

scanf("%s", …) chỉ đọc tới khoảng trắng đầu tiên, nên “Nguyen Van A” sẽ chỉ lấy “Nguyen”. Muốn đọc cả dòng cần cách khác (vd fgets) - để dành cho bài/khoá sau.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Vì sao scanf cần dấu & trước tên biến mà printf thì không?

  1. 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. 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. 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. 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. 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. 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: printf nhắc, scanf("%d", &tuoi), rồi printf("...%d...\n", tuoi + 1).