Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Hướng dẫn STL | Lớp String Kiểu dữ liệu của mọi hệ điều hành

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Red face Hướng dẫn STL | Lớp String Kiểu dữ liệu của mọi hệ điều hành

    Giới thiệu

    Kiểu chuỗi char [] của C và hạn chế

    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: 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 <string.h> . Có nhiều bất tiện khi dùng theo cách thức này:
    - Người lập trình phải chủ động kiểm soát bộ nhớ cấp phát cho chuỗi ký tự. Nói chung là phải am hiểu và rất thông thạo về kỹ thuật dùng bộ nhớ và con trỏ thì chương trình mới tránh được các lỗi về kỹ thuật;
    - Không thể gán giá trị hay sử dụng phép toán + (ghép chuỗi) và các phép toán so sánh như: > (lớn hơn), < (nhỏ hơn),… mà phải gọi các hàm thư viện trong <string.h>;
    - Nếu dùng kỹ thuật cấp phát động thì phải quán xuyến việc cấp thêm bộ nhớ khi chuỗi dãn ra (chẳng hạn do ghép chuỗi) và phải hủy bộ nhớ (khi không dùng nữa) để tránh việc cạn kiệt bộ nhớ của máy tính trong trường hợp có nhiều chương trình hoạt động đồng thời.
    Ghi chú: Cũng có thể dùng các phép toán >> (extraction) và << (insertion) tương ứng với cin và cout cho chuỗi ký tự cũ của Ngôn ngữ C, xem chương trình sau đây:
    Code:
    // Old style string in C
    #include <iostream.h>
    void main ()
    {
    	const int MAXSIZE=256;
    	char str[MAXSIZE];
    
    	cout << “Input a string: ”;
    	cin.getline(str, MAXSIZE);
    	cout << “Your string: ” << str << endl;
    
    	cout << “Input a word: ”;
    	cin >> str;
    	cout << “Your word: ” << str << endl;
    }
    Chú ý rằng lệnh cin >> str; lấy các ký tự đưa vào chuỗi str đến khi gặp một khoảng trống (blank) thì dừng. Trong khi đó nếu dùng cin.getline( ) như trong chương trình trên thì cả các khoảng trống cũng được lấy đưa vào chuỗi str (đến khi nhấn enter thì mới dừng) vì mặc nhiên thì ký tự ngắt (delimeter) là ‘\n’ (newline, ký tự xuống dòng). Thực ra lệnh nói trên tương đương với lệnh:
    cin.getline(str, MAXSIZE, ’\n’);
    Nếu chúng ta thay lệnh này bởi: cin.getline(str, MAXSIZE, ‘ ’); (ký tự ngắt là blank) thì sẽ tương tự với: cin >> str;
    Trong chương trình nói trên thì độ dài tối đa có thể được của chuỗi ký tự là MAXSIZE – 1 (vì còn dành 1 byte cho ký tự kết thúc chuỗi).


    Kiểu chuỗi string trong thư viện STL của C++

    Thư viện chuẩn STL (Standard Template Library) của C++ có hỗ trợ kiểu string cùng với các phép toán và phương thức khá tiện lợi cho người lập trình. Hiện tại thì Visual C++ và hầu hết các trình biên dịch C++ trên Linux/Unix đều có sẵn thư viện STL nên ta có thể dùng kiểu string. Riêng các phiên bản hiện nay của Borland C++ thì dùng một thư viện template riêng mà không bao gồm thư viện STL.( khuyến cáo : khi dùng STL thì nên dùng Code::block nhé )
    Chương trình sau đây cho thấy việc sử dụng kiểu string nhờ vào dùng thư viện STL khá đơn giản và tiện lợi.
    Code:
    #include <string>
    #include <iostream>
    using namespace std;
    
    void strSort (int n, string str[]);
    void main ()
    {
    	string str1(“012”);
    	string str2(“345”);
    	string s;
    
    	s=str1+str2;
    	cout << “Result: ” << s << endl;
    
    	string country[] = {“Viet nam”, “Lao”, “Campuchia”,
    “Thai lan”, “Trung quoc”};
    
    int n=5;
    	strSort(n, country);
    	cout << “After sorting…” << endl;
    	for (int i=0; i<n; i++)
    		cout << “\t” << country[i] << endl;
    }
    
    void strSort (int n, string str[])
    {
    	for (int i=0; i<n-1; i++)
    		for (int j=i+1; j<n; j++)
    			if (str[i] > str[j]) {
    				string s = str[i];
    				str[i] = str[j];
    				str[j] = s;
    }
    }
    Trong chương trình trên, cần chú ý các điểm sau:
    - Các chỉ thị include và using namespace cần thiết để khai báo sử dụng kiểu string;
    - Có thể khởi động và sao chép giá trị nhờ phép gán =, có thể dùng phép + để ghép chuỗi;
    - Trong hàm strSort( ) ta có thể dùng phép so sánh > (lớn hơn) để so sánh 2 biến chuỗi;
    - Có thể dùng toán tử << (insertion) với cout để xuất một chuỗi ra màn hình nhập xuất.
    Cũng có thể dùng toán tử >> (extraction) với cin để nhập một chuỗi ký tự đến khi gặp một khoảng trống thì dừng.
    • Các phương thức/phép toán tiện ích của kiểu string

    Kiể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
    - Phép cộng (+) dùng để ghép hai chuỗi và cũng để ghép một ký tự vào chuỗi;
    - Các phép so sánh theo thứ tự từ điển: == (bằng nhau), != (khác nhau), > (lớn hơn), >= (lớn hơn hay bằng), < (nhỏ hơn), <= (nhỏ hơn hay bằng);
    - Phương thức length( ) và phép lấy chỉ số [ ] để duyệt từng ký tự của chuỗi: nếu s là biến kiểu string thì s[i] là ký tự thứ i của s với 0 ≤ i <s.length( );
    - Phép gán (=) dùng để gán biến kiểu string bằng một hằng chuỗi, chẳng hạn:
    {
    char st[]=“ABCDEF”;
    string s;

    s=“XYZ”;
    cout << s << endl;
    s=st;
    cout << s.length() << “ : ” << s << endl;
    //…
    }
    b) Các phương thức chèn, xóa, lấy chuỗi con
    - Phương thức substr(int pos, int nchar) trích ra chuỗi con của một chuỗi cho trước, ví dụ str.substr(2,4) trả về chuỗi con gồm 4 ký tự của chuỗi str kể từ ký tự ở vị trí thứ 2 (ký tự đầu tiên của chuỗi ở vị trí 0).
    - Phương thức insert( ) chèn thêm ký tự hay chuỗi vào một vị trí nào đó của chuỗi str cho trước. Có nhiều cách dùng phương thức này:
    str.insert(int pos, char* s): chèn s (mảng ký tự kết thúc ‘\0’) vào vị trí pos của str;
    str.insert(int pos, string s): chèn chuỗi s (kiểu string) vào vị trí pos của chuỗi str;
    str.insert(int pos, int n, int ch): chèn n lần ký tự ch vào vị trí pos của chuỗi str;
    - Phương thức str.erase(int pos, int n) xóa n ký tự của chuỗi str kể từ vị trí pos; nếu không quy định giá trị n thì tất cả các ký tự của str từ vị trí pos trở đi sẽ bị xóa.
    c) Các phương thức tìm kiếm và thay thế
    - Phương thức find( ) tìm kiếm xem một ký tự hay một chuỗi nào đó có xuất hiện trong một chuỗi str cho trước hay không. Có nhiều cách dùng phương thức này:
    str.find(int ch, int pos = 0): tìm ký tự ch kể từ vị trí pos đến cuối chuỗi str
    str.find(char *s, int pos = 0): tìm s (mảng ký tự kết thúc ‘\0’) kể từ vị trí pos đến cuối
    str.find(string& s, int pos = 0): tìm chuỗi s kể từ vị trí pos đến cuối chuỗi.
    Nếu không quy định giá trị pos thì hiểu mặc nhiên là 0; nếu tìm có thì phương thức trả về vị trí xuất hiện đầu tiên, ngược lại trả về giá trị -1.
    - Phương thức replace( ) thay thế một đoạn con trong chuỗi str cho trước (đoạn con kể từ một vị trí pos và đếm tới nchar ký tự ký tự về phía cuối chuỗi) bởi một chuỗi s nào đó, hoặc bởi n ký tự ch nào đó. Có nhiều cách dùng, thứ tự tham số như sau:
    str.replace(int pos, int nchar, char *s);
    str.replace(int pos, int nchar, string s);
    str.replace(int pos, int nchar, int n, int ch);
    d) Một số phương thức khác
    Cò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_str( ). Cách dùng các hàm này đều được trình bày trong hệ thống giúp đỡ của các môi trường có hỗ trợ STL. Ngoài ra các phương thức như find_first_of( ) lại tương tự như find( ); find_last_of( ) lại tương tự như rfind( ).
    Đã được chỉnh sửa lần cuối bởi AlexF : 30-01-2009 lúc 08:23 PM.

  2. #2
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    cách sử dụng và ý nghĩa các phương thức String

    A) Địa chỉ của ký tự
    1) string::begin
    ý nghĩa trả lại ký tự đầu tiên của chuỗi
    kiểu dữ liệu trả về iterator
    VD
    PHP Code:
    // string::begin and string::end
    #include <iostream>//thư viện chuẩn STL không có .h
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");//tạo chuỗi
      
    string::iterator it;//khai báo kiểu dữ liệu cho ký tự
      
    for ( it=str.begin() ; it str.end(); it++ )
        
    cout << *it;
      return 
    0;

    //chương trình sẽ cho chạy từ các ký tự từ đầu đến cuối
    2) string::end
    trả lại ký tự cuối cùng cho chuỗi
    kiểu dữ liệu trả về iterator
    VD
    PHP Code:
    // string::begin and string::end
    #include <iostream>//thư viện chuẩn STL không có .h
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");//tạo chuỗi
      
    string::iterator it;//khai báo kiểu dữ liệu cho ký tự
      
    for ( it=str.begin() ; it str.end(); it++ )
        
    cout << *it;
      return 
    0;

    3) string::rbegin

    trả lại ký tự đầu tiên từ bên phải ( cũng tương đương với ký tự cuối cùng bên trái
    <-> string::end )
    kiểu dữ liệu trả về iterator
    VD
    PHP Code:
    // string::rbegin and string::rend
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("now step live...");
      
    string::reverse_iterator rit;
      for ( 
    rit=str.rbegin() ; rit str.rend(); rit++ )
        
    cout << *rit;
      return 
    0;

    4) String:: rend
    Trả về ký tự cuối cùng từ bên phải

    B) vấn đề bộ nhớ
    5) string::size

    trả về số ký tự của chuỗi ( tương tự như string::length
    VD
    PHP Code:
    // string::size
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");
      
    cout << "The size of str is " << str.size() << " characters.\n";
      return 
    0;

    Output:
    The size of str is 11 characters.

    6) string::length
    trả về số ký tự của chuỗi
    PHP Code:
    // string::length
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");
      
    cout << "The length of str is " << str.length() << " characters.\n";
      return 
    0;

    Output:
    The length of str is 11 characters.
    7)string::max_size
    trả về số ký tự nhiều nhất mà chuỗi có thể có
    VD
    PHP Code:
    // comparing size, length, capacity and max_size
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");
      
    cout << "size: " << str.size() << "\n";
      
    cout << "length: " << str.length() << "\n";
      
    cout << "capacity: " << str.capacity() << "\n";
      
    cout << "max_size: " << str.max_size() << "\n";
      return 
    0;

    Output
    size: 11
    length: 11
    capacity: 15
    max_size: 4294967291

    7) string::resize
    có 2 dạng hàm là
    void resize ( size_t n, char c );
    void resize ( size_t n );

    hàm void resize ( size_t n );
    áp số ký tự của chuỗi là n
    nếu n nhỏ hơn số ký tự của chuỗi -> các ký tự còn thiếu sẽ bị xóa đi
    nếu n lớn hơn số ký tự của chuỗi -> các ký tự thừa là các ký tự NULL

    hàm void resize ( size_t n, char c );
    nếu n nhỏ hơn số ký tự của chuỗi -> các ký tự còn thiếu sẽ bị xóa đi
    nếu n lớn hơn số ký tự của chuỗi -> ký tự C sẽ chiếm vị trí các ký tự thừa ra ( thay vì NULL như hàm 1)
    VD:
    PHP Code:
    // resizing string
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    size_t sz;
      
    string str ("I like to code in C");
      
    cout << str << endl;

      
    sz=str.size();

      
    str.resize (sz+2,'+');
      
    cout << str << endl;

      
    str.resize (14);
      
    cout << str << endl;
      return 
    0;

    trả lại giá trị: nếu size yêu cầu lớn hơn giá trị max( string::max_size) của chuối nó sẽ trả về giá trị max của chuỗi

    8)String::capacity

    Trả về kích cỡ lưu trữ của chuỗi
    VD
    PHP Code:
    // comparing size, length, capacity and max_size
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");
      
    cout << "size: " << str.size() << "\n";
      
    cout << "length: " << str.length() << "\n";
      
    cout << "capacity: " << str.capacity() << "\n";
      
    cout << "max_size: " << str.max_size() << "\n";
      return 
    0;

    9)
    String::reserve();

    Cấp phát bộ nhớ cho chuỗi
    VD khi cần dùng chuỗi để lưu file vào máy tính
    Trả về giá trị NULL,nếu giá trị trả về lớn hơn giá trị max mà chuỗi String có thể đạt được thì trả về giá trị max của string (string::max_size)
    VD
    PHP Code:
    // string::reserve
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str;
      
    size_t filesize;

      
    ifstream file ("test.txt",ios::in|ios::end);
      
    filesize=file.tellg();

      
    str.reserve(filesize);

      
    file.seekg(0);
      while (!
    file.eof())
      {
        
    str += file.get();
      }
      
    cout << str;
      return 
    0;

    10) void clear();
    Đưa string về dạng rỗng
    VD
    PHP Code:
    // string::clear
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str;
      
    char c;
      
    cout << "Please type some lines of text. Enter a period to finish:\n";
      do {
        
    c=cin.get();
        
    str += c;
        if (
    c=='\n')
        {
           
    cout << str;
           
    str.clear();
        }
      } while (
    c!='.');
      return 
    0;

    11)
    bool empty ( ) const;

    kiểm tra 1 string có đang rỗng hay không
    trả về giá trị true nếu string đang rỗng,false nếu ngược lại

    PHP Code:
    // string::empty
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string content;
      
    string line;
      
    cout << "Please introduce a text. Enter an empty line to finish:\n";
      do {
        
    getline(cin,line);
        
    content += line '\n';
      } while (!
    line.empty());
      
    cout << "The text you introduced was:\n" << content;
      return 
    0;

    C) vấn đề toán tử

    12) string::operator
    Trả về giá trị của ký tự ở 1 địa chỉ của string
    Giá trị này bắt đầu bằng = chứ không phải bắt đầu bằng 1,giá trị có kiểu dữ liệu là size_t
    VD

    PHP Code:
    // string::operator[]
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");
      
    int i;
      for (
    i=0str.length(); i++)
      {
        
    cout << str[i];
      }
      return 
    0;

    13)
    const char& at ( size_t pos ) const;char& at ( size_t pos );

    lấy ký tự tại 1 địa chỉ xác định
    VD
    PHP Code:
    // string::at
    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
      
    string str ("Test string");
      
    int i;
      for (
    i=0str.length(); i++)
      {
        
    cout << str.at(i);
      }
      return 
    0;

    còn tiếp....


    14 operator+
    có khai báo
    string operator+ (const string& lhs, const string& rhs);
    string operator+ (const char* lhs, const string& rhs);
    string operator+ (char lhs, const string& rhs);
    string operator+ (const string& lhs, const char* rhs);
    string operator+ (const string& lhs, char rhs);

    trả về 1 đối tượng kiểu string là tổng hợp của 2 string lhs và rhs.

    VD

    PHP Code:
    // adding strings
    #include <iostream>
    #include <string>
    using namespace std;

    main ()
    {
      
    string firstlevel ("com");
      
    string secondlevel ("congdongcviet");
      
    string scheme ("http://");
      
    string hostname;
      
    string url;

      
    hostname "www." secondlevel '.' firstlevel;
      
    url scheme hostname;

      
    cout << url << endl;

      return 
    0;

    15 swap

    void swap ( string& lhs, string& rhs);

    đổi chỗ giá trị 2 đối tượng lhsvà rhs cho nhau

    chú ý,có thể có cách gọi khác

    lhs.swap(rhs);
    PHP Code:
    // swap strings
    #include <iostream>
    #include <string>
    using namespace std;

    main ()
    {
      
    string buyer ("money");
      
    string seller ("goods");

      
    cout << "Before swap, buyer has " << buyer;
      
    cout << " and seller has " << seller << endl;

      
    swap (buyer,seller);

      
    cout << " After swap, buyer has " << buyer;
      
    cout << " and seller has " << seller << endl;

      return 
    0;

    17 getline

    istream& getline ( istream& is, string& str, char delim );
    istream& getline ( istream& is, string& str );

    nhập 1 chuỗi từ bàn phím

    với các tham số
    Parameters

    is
    đối tượng của lớp istream được gọi đến
    str
    tên của chuỗi string đựoc gán giá trị vào
    delim
    ký tự được định nghĩa là ký tự kết thúc


    PHP Code:
    // getline with strings
    #include <iostream>
    #include <string>
    using namespace std;

    int main () {
      
    string str;
      
    cout << "Please enter full name: ";
      
    getline (cin,str);
      
    cout << "Thank you, " << str << ".\n";

    trả về giá trị

    Return Value
    nếu không có lỗi,trả về giống đối tượng IS


    18 các kiểu so sánh 2 string


    bool operator== ( const string& lhs, const string& rhs ); --> có thể so sánh 2 string với nhau
    bool operator== ( const char* lhs, const string& rhs );--> có thể so sánh 1 chuỗi char và 1 string
    bool operator== ( const string& lhs, const char* rhs );

    bool operator!= ( const string& lhs, const string& rhs );
    bool operator!= ( const char* lhs, const string& rhs );
    bool operator!= ( const string& lhs, const char* rhs );

    bool operator< ( const string& lhs, const string& rhs );
    bool operator< ( const char* lhs, const string& rhs );
    bool operator< ( const string& lhs, const char* rhs );

    bool operator> ( const string& lhs, const string& rhs );
    bool operator> ( const char* lhs, const string& rhs );
    bool operator> ( const string& lhs, const char* rhs );

    bool operator<= ( const string& lhs, const string& rhs );
    bool operator<= ( const char* lhs, const string& rhs );
    bool operator<= ( const string& lhs, const char* rhs );

    bool operator>= ( const string& lhs, const string& rhs );
    bool operator>= ( const char* lhs, const string& rhs );
    bool operator>= ( const string& lhs, const char* rhs );


    cả lhs , rhs đều có kiểu dữ liệu string hoặc char và string
    Đã được chỉnh sửa lần cuối bởi AlexF : 30-01-2009 lúc 08:22 PM.

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    21

    Bài viết này đầy đủ & hệ thống hơn nè:
    http://www.scribd.com/full/14721319?...yoogkykgm204r3
    Đã được chỉnh sửa lần cuối bởi regist : 29-04-2009 lúc 12:55 AM.

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Nếu Muốn thực sự đầy đủ thì bạn hãy đọc quyển Lập trình C++ của bưu chính viễn thông,về phần STL rất đầy đủ mà lại là tiếng việt

Các đề tài tương tự

  1. C++ Tutorial hướng dẫn thao tác string variable.. kiểu dữ liệu string
    Gửi bởi beautifulsoul84hung trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 05-12-2016, 03:20 AM
  2. làm thế nào chuyển String o[] sang String hoặc byte[].
    Gửi bởi zzvanquyenzz trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 1
    Bài viết cuối: 17-06-2013, 09:24 AM
  3. Method String.CompareTo(string strB) trong C# thực hiện so sánh 2 chuỗi như thế nào?
    Gửi bởi tpqnnd trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 27-05-2012, 10:52 AM
  4. Bài tập C++ tạo toán tử ==trong lớp string với tham số là string, char
    Gửi bởi truonglong99 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 24-10-2011, 08:56 AM
  5. Lập trình C++ sử dụng string trong C++. Lỗi C2146: syntax error : missing ';' before identifier tại string string_rep()const;?
    Gửi bởi levanvuonglvv trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 15-09-2011, 10:28 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn