Tạo bởi Trần Văn Điêp|
Lập Trình C

[Video] Bài tập - Nhập xuất thông tin sinh viên - Lập trình C

💡 Mục tiêu bài học

  • Ôn lại khai báo biến chuỗi và số nguyên

  • Thực hành nhập dữ liệu có khoảng trắng (tên, địa chỉ)

  • Hiểu cách xử lý bộ đệm nhập (input buffer)

  • In thông tin ra màn hình theo 2 định dạng khác nhau


💻 Code hoàn chỉnh (phiên bản cơ bản, không dùng struct)

#include <stdio.h> #include <string.h> int main() { char rollno[16]; int age; char name[50]; char address[200]; // Nhập thông tin sinh viên printf("Nhap ten sinh vien: "); fgets(name, sizeof(name), stdin); name[strcspn(name, "\n")] = '\0'; // Xóa ký tự xuống dòng ở cuối printf("Nhap tuoi: "); scanf("%d", &age); getchar(); // Xóa ký tự '\n' còn trong bộ đệm printf("Nhap ma sinh vien (rollno): "); fgets(rollno, sizeof(rollno), stdin); rollno[strcspn(rollno, "\n")] = '\0'; printf("Nhap dia chi: "); fgets(address, sizeof(address), stdin); address[strcspn(address, "\n")] = '\0'; // In ra màn hình theo yêu cầu printf("\n===== KET QUA HIEN THI =====\n"); // Cách 1: In thành 1 dòng printf("\nCach 1: In tren mot dong\n"); printf("%s, %d, %s, %s\n", name, age, rollno, address); // Cách 2: In dạng bảng printf("\nCach 2: In theo bang dinh dang\n"); printf("============================================================\n"); printf("| %-15s | %-5s | %-10s | %-20s |\n", "Ten", "Tuoi", "Ma SV", "Dia chi"); printf("============================================================\n"); printf("| %-15s | %-5d | %-10s | %-20s |\n", name, age, rollno, address); printf("============================================================\n"); return 0; }

🧩 Giải thích từng phần

1. Khai báo biến

char rollno[16]; int age; char name[50]; char address[200];
  • char ...[n] dùng để chứa chuỗi (văn bản).

  • int chứa số nguyên (tuổi).

  • Kích thước mảng đủ lớn để chứa dữ liệu nhập vào.


2. Nhập dữ liệu có khoảng trắng

Nếu dùng scanf("%s", name) → chỉ đọc đến dấu cách đầu tiên.
Ví dụ nhập “Tran Van A” → chỉ đọc được “Tran”.

✅ Giải pháp: dùng fgets()

fgets(name, sizeof(name), stdin); name[strcspn(name, "\n")] = '\0'; // xóa ký tự xuống dòng

Hàm strcspn(name, "\n") tìm vị trí ký tự \n và thay bằng \0 (kết thúc chuỗi).


3. Xử lý bộ đệm sau khi nhập số

Sau khi nhập tuổi bằng scanf, vẫn còn ký tự \n trong bộ nhớ.
Nếu không xử lý, lệnh fgets() kế tiếp sẽ đọc nhầm dòng trống.

✅ Cách khắc phục:

getchar(); // “ăn” ký tự xuống dòng còn sót lại

4. In ra theo yêu cầu

Cách 1 – In trên 1 dòng:

printf("%s, %d, %s, %s\n", name, age, rollno, address);

Ví dụ:

Tran Van A, 18, R001, Ha Noi

Cách 2 – In dạng bảng:

printf("| %-15s | %-5d | %-10s | %-20s |\n", name, age, rollno, address);
  • %-15s → in chuỗi trong khung rộng 15 ký tự, canh trái

  • %-5d → in số nguyên trong khung 5 ký tự

  • %-20s → in địa chỉ trong khung 20 ký tự

Kết quả:

============================================================ | Ten | Tuoi | Ma SV | Dia chi | ============================================================ | Tran Van A | 18 | R001 | Ha Noi | ============================================================

🧠 Kiến thức rút ra

  1. fgets() là cách nhập chuỗi an toàn, đọc được cả dấu cách.

  2. Sau khi nhập số bằng scanf, nên dùng getchar() để dọn bộ đệm.

  3. printf với định dạng cột cố định giúp tạo bảng dữ liệu gọn gàng.

  4. Không dùng gets()dễ gây lỗi tràn bộ nhớ (đã bị loại bỏ từ C11).


✅ Bài tập mở rộng (tự luyện)

  • Thử nhập thông tin của 2 sinh viên, rồi in ra 2 dòng trong bảng.

  • Thử đổi độ rộng các cột để bảng hiển thị đẹp hơn.

  • Thêm cột “Điểm trung bình” (float) và hiển thị kèm theo.

Phản hồi từ học viên

5

Tổng 0 đánh giá

Đăng nhập để làm bài kiểm tra

Chưa có kết quả nào trước đó