Trong C++, stringstream là một lớp mạnh mẽ cho phép liên kết một đối tượng string với một luồng (stream). Nhờ đó, chúng ta có thể đọc dữ liệu từ chuỗi giống như đọc từ cin hoặc ghi vào chuỗi giống như ghi vào cout. Lớp này được định nghĩa trong header <sstream>.
Các phương thức phổ biến của stringstream
- clear(): Xóa trạng thái luồng, đặt lại các cờ lỗi.
- str(): Lấy hoặc thiết lập nội dung chuỗi bên trong luồng.
- operator << : Chèn dữ liệu vào luồng (ghi).
- operator >> : Trích xuất dữ liệu từ luồng (đọc).
Ví dụ 1: Tách từ trong chuỗi
Chương trình sau minh họa cách sử dụng stringstream để tách một câu thành các từ riêng lẻ và lưu vào vector.
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str("Hello from the dark side");
string tmp; // Biến tạm chứa từng từ
stringstream str_strm(str); // Khởi tạo stringstream từ chuỗi str
vector<string> words; // Vector lưu các từ
// Đọc từng từ từ luồng (tự động bỏ qua khoảng trắng)
while (str_strm >> tmp) {
// Có thể thêm kiểm tra: bỏ qua ký tự đặc biệt (!, ., ?) nếu cần
words.push_back(tmp);
}
// In ra các từ
for (int i = 0; i < words.size(); i++)
cout << words[i] << endl;
return 0;
}
Kết quả
Hello from the dark side
Ví dụ 2: Chuyển đổi số thập phân sang hệ thập lục phân
Sử dụng manipulator hex cùng với stringstream để chuyển đổi số nguyên sang chuỗi hex.
#include <iostream>
#include <sstream>
using namespace std;
int main() {
int decimal = 61;
stringstream my_ss;
my_ss << hex << decimal; // Ghi giá trị hex vào luồng
string res = my_ss.str(); // Lấy chuỗi kết quả
cout << "Gia tri thap luc phan cua 61 la: " << res;
return 0;
}
Kết quả
Gia tri thap luc phan cua 61 la: 3d
Lưu ý: stringstream rất hữu ích khi cần phân tích cú pháp (parsing) chuỗi, định dạng đầu ra, hoặc chuyển đổi kiểu dữ liệu an toàn hơn so với các hàm C truyền thống như sscanf/sprintf.