Tổng quan
sprintf() và sscanf() là hai hàm trong <stdio.h> dùng để ghi và đọc dữ liệu từ/đến chuỗi ký tự (string) thay vì stdin/stdout.
| Hàm | Chức năng | Tương tự |
|---|---|---|
sprintf() | Ghi dữ liệu đã định dạng vào chuỗi | printf() nhưng ra string |
sscanf() | Đọc dữ liệu từ chuỗi theo định dạng | scanf() nhưng từ string |
1. Hàm sprintf() - Ghi vào chuỗi
Cú pháp
int sprintf(char *str, const char *format, ...);
str: Mảng char đích (phải đủ lớn)format: Chuỗi định dạng (như printf)- Trả về: Số ký tự đã ghi (không tính null terminator)
Ví dụ cơ bản
#include <stdio.h>
int main() {
char chuoi[100];
int a = 20, b = 30;
// Ghi phép cộng vào chuỗi
sprintf(chuoi, "Tong cua %d + %d = %d", a, b, a + b);
printf("Chuoi ket qua: %s\n", chuoi);
return 0;
}
Kết quả
Chuoi ket qua: Tong cua 20 + 30 = 50
2. Hàm sscanf() - Đọc từ chuỗi
Cú pháp
int sscanf(const char *str, const char *format, ...);
str: Chuỗi nguồnformat: Định dạng đọc (như scanf)- Trả về: Số mục đọc thành công
Ví dụ cơ bản
#include <stdio.h>
int main() {
char chuoi[] = "25 12 2024";
int ngay, thang, nam;
// Đọc 3 số nguyên từ chuỗi
int kq = sscanf(chuoi, "%d %d %d", &ngay, &thang, &nam);
printf("Doc duoc %d gia tri\n", kq);
printf("Ngay: %d, Thang: %d, Nam: %d\n", ngay, thang, nam);
return 0;
}
Kết quả
Doc duoc 3 gia tri
Ngay: 25, Thang: 12, Nam: 2024
Ví dụ thực tế: Phân tích chuỗi CSV
#include <stdio.h>
#include <string.h>
int main() {
char csv[] = "NV001,Nguyen Van A,25,15000000";
char ma[10], ten[50];
int tuoi;
float luong;
// %[^,] đọc đến khi gặp dấu phẩy
sscanf(csv, "%[^,],%[^,],%d,%f", ma, ten, &tuoi, &luong);
printf("Ma NV: %s\n", ma);
printf("Ten: %s\n", ten);
printf("Tuoi: %d\n", tuoi);
printf("Luong: %.0f\n", luong);
return 0;
}
Kết quả
Ma NV: NV001
Ten: Nguyen Van A
Tuoi: 25
Luong: 15000000
Ví dụ: Chuyển đổi số sang chuỗi (sprintf)
#include <stdio.h>
int main() {
int so = 12345;
char chuoi[20];
// Chuyển int -> string
sprintf(chuoi, "%d", so);
printf("So: %d\n", so);
printf("Chuoi: %s\n", chuoi);
printf("Do dai chuoi: %lu\n", strlen(chuoi));
return 0;
}
So sánh với printf/scanf
| Đặc điểm | printf/scanf | sprintf/sscanf |
|---|---|---|
| Nguồn/Đích | stdin/stdout (console) | Bộ nhớ (char array) |
| An toàn | An toàn | Cần đảm bảo buffer đủ lớn |
| Dùng cho | Tương tác người dùng | Xử lý chuỗi, format data, log |
| Bộ đệm | Tự động | Người lập trình quản lý |
Lưu ý an toàn (Buffer Overflow)
// NGUY HIỂM - có thể tràn buffer
char buf[10];
sprintf(buf, "Day la mot chuoi rat dai"); // Ghi quá 10 bytes!
// AN TOÀN - dùng snprintf (C99)
char buf[10];
snprintf(buf, sizeof(buf), "Day la mot chuoi rat dai"); // Tự cắt bớt
Luôn ưu tiên snprintf() thay vì sprintf() trong code thực tế!