Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Hàm sprintf() và sscanf() trong C: Đọc/ghi chuỗi

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ỗiprintf() nhưng ra string
sscanf()Đọc dữ liệu từ chuỗi theo định dạngscanf() 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ồn
  • format: Đị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/Đíchstdin/stdout (console)Bộ nhớ (char array)
An toànAn toànCần đảm bảo buffer đủ lớn
Dùng choTương tác người dùngXử lý chuỗi, format data, log
Bộ đệmTự độngNgườ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ế!