Viết chương trình nhập vào một xâu ký tự đếm và in ra màn hình số kí tự la dấu cách có trong xâu
Bài viết sưu tầm trên mạng. Show
0. Kiểu chuỗi của C và hạn chếKhi mới học C, chắc các bạn đều rất bối rối khi làm việc với xâu ký tự, việc sử dụng con trỏ lưu xâu ký tự rất phức tạp, dễ gây lỗi khiến nhiều người cho rằng nó không bằng xâu ký tự trong Pascal. Các chương trình C++ có thể sử dụng chuỗi theo cách thức cũ của Ngôn ngữ C (trong bài viết này gọi là C-String): mảng các ký tự kết thúc bởi ký tự mã ASCII là 0 (ký tự \0) cùng với các hàm thư viện khai báo trong
1. Kiểu chuỗi string trong thư viện STL của C++Thư viện chuẩn STL (Standard Template Library) cung cấp kiểu string (xâu ký tự), giúp các bạn tránh khỏi hoàn toàn các phiền phức nêu trên.Các chỉ thị #include cần khai báo để sử dụng string: #includeNếu bạn muốn tận dụng các hàm của C-String, cần chuyển đổi giữa 2 kiểu dữ liệu này:
2. Các phương thức, phép toán tiện ích của kiểu stringKiểu string của STL hỗ trợ các nhóm phương thức và phép toán tiện ích sau đây. a) Các phép toán và phương thức cơ bản
String thực chất là một vector
b) Các phương thức chèn, xóa, lấy chuỗi con:
c) So sánhBạn có thể đơn giản là sử dụng những toán tử quan hệ (==, !=, <, <=, >=) được định nghĩa sẵn. Tuy nhiên, nếu muốn so sánh một phần của một chuỗi thì sẽ cần sử dụng phương thức compare(): int compare ( const string& str ) const; int compare ( const char* s ) const; int compare ( size_t pos1, size_t n1, const string& str ) const; int compare ( size_t pos1, size_t n1, const char* s) const; int compare ( size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2 ) const; int compare ( size_t pos1, size_t n1, const char* s, size_t n2) const;Hàm trả về 0 khi hai chuỗi bằng nhau và lớn hơn hoặc nhỏ hơn 0 cho trường hợp khác Ví dụ: // comparing apples with apples #included) Các phương thức tìm kiếm và thay thế
e) Tách xâuTrong việc xử lý xâu ký tự, không thể thiếu được các thao tác tách xâu ký tự thành nhiều xâu ký tự con thông qua các ký tự ngăn cách. Các hàm này có sẵn trong các ngôn ngữ khác như Visual Basic, Java, hay thậm chí là trong Output: Xin chao tat ca cac banChú ý rằng, cách này cũng có thể dễ áp dụng nếu bạn muốn chuyển số thành xâu (hoặc ngược lại), tách 1 xâu thành nhiều số. Nếu không muốn sử dụng stringstream, các bạn cũng có thể tự xây dựng hàm tách xâu như sau: string S = "Xin chao tat ca cac ban"; // Khởi tạo giá trị của xâu string::iterator t, t2; // Các biến lặp vector<string> split; // Mảng các xâu (lưu kết quả tách) for (t=S.begin(); t<S.end();) { // Lặp từ vị trí bắt đầu t2=find(t, S.end(), ' '); // TÌm ký tự space ' ' đầu tiên // kể từ vị trí t if (t!=t2) split.push_back(string(t, t2)); // Lấy xâu ký tự giữa 2 vị trí t = t2+1; // Chuyển sang vị trí sau } for (int i=0; i<splitìsize(); i++) cout << split[i] << endl; // In mảng các xâu ký tự getchar();Output: Xin chao tat ca cac banĐoạn chương tr.nh sử dụng các kỹ thuật sau
Hàm này cũng tự động sinh ra ký tự null chèn vào cuối xâu. Từ prototype ta cũng thấy được hàm trả về một hằng chuỗi, điều này đồng nghĩa với việc ta không thể thay đổi chuỗi trả về. Gọi phương thức c_str(); string s = "some_string"; cout << s.c_str() << endl; cout << strlen(s.c_str()) << endl;Sau đây là ví dụ bên trên được viết lại dùng hàm thành viên c_str() và các hàm trong Output: Xin chao tat ca cac banf) Chuyển đổi hàng loạt với transformOutputIterator transform( InputIterator first, InputIterator last, OutputIterator result, UnaryOperation unary_op ); #includeg) Một số phương thức khácCòn nhiều phương thức tiện ích khác như: append(), rfind(), find_first_not_of(), find_last_not_of(), swap(). Cách dùng các hàm này đều được trình bày trong hệ thống hướng dẫn (help) của các môi trường có hỗ trợ STL (trong VC++ là MSDN). Ngoài ra các phương thức như find_first_of() tương tự như find(), find_last_of() tương tự như rfind() |