[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). -
intchứ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ự\nvà 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
-
fgets() là cách nhập chuỗi an toàn, đọc được cả dấu cách.
-
Sau khi nhập số bằng
scanf, nên dùng getchar() để dọn bộ đệm. -
printf với định dạng cột cố định giúp tạo bảng dữ liệu gọn gàng.
-
Không dùng
gets()vì 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.