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

Đề tài: [C++String] Xử lý chuỗi với stringUtils

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định [C++String] Xử lý chuỗi với stringUtils

    stringUtils là một thư viện mini nhỏ về string mà mình viết ra và được đóng gói trong bộ uiClass của mình (uiClass chính là openGUI mà mình đã sử dụng nó trong tut 3DMath). Hy vọng vào tháng 3 năm sau mình sẽ kịp giới thiệu sản phẩm đầu tiên và cũng là thật sự viết trên bộ uiClass này.

    Quay lại với chủ đề chính là stringUtils. Nó bao gồm một số function thường sử dụng nhất để xử lý trên chuỗi hoặc giải mã một số format text mà bạn cần phải làm...

    Dĩ nhiên trên đây chưa phải đầy đủ nhưng dần dần theo thời gian mình sẽ cập nhật nó.

    stringUtils có đặc điểm là ko xử lý string đối với đối tượng nào như CString của MFC hay string và wstring của iostream mà làm trên các dữ liệu cơ bản như char và wchar điều này sẽ khiến stringUtils cơ động hơn. Với những người mà thích lập trình trên pure Win32 giống mình thì 1 thư viện stringUtils là rất cần thiết. Bởi vì nó ko có hỗ trợ string mà bạn cần phải lục lọi các function của C, đã thế còn bị warning nữa.

    Tất cả các hàm của stringUtils đều viết trên template để có thể chủ động xử lý trên unicode lẫn ansi.

    Các bạn có thể download nó về "stringUtils.h" có source trên đó và chỉnh sửa, thêm mắm múi tùy ý như chuyển thành đối tượng,... sao cho nó phù hợp với nhu cầu sử dụng của bạn.



    Sau đây mình sẽ giới thiệu sơ qua cách sử dụng.
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 14-12-2008 lúc 04:45 PM.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    I. Cơ bản về chuỗi

    1. Copy chuỗi

    Copy chuỗi ký tự "đích" thành chuỗi "nguồn"
    C++ Code:
    1. stringUtils::copy<T,T>( đích, nguồn)

    Ví dụ:
    - Sử dụng ANSI
    C++ Code:
    1. char lpString[300];
    2.  
    3. stringUtils::copy<char,char>(lpString,"hello string!\n");
    4. std::cout << lpString;

    - Sử dụng UNICODE
    C++ Code:
    1. WCHAR lpString[300];
    2. stringUtils::copy<WCHAR,WCHAR>(lpString,L"hello unicode string!\n");

    - Ngoài ra bạn có thể chủ động chuyển Unicode về thành Ansi và ngược lại.
    C++ Code:
    1. WCHAR lpString[300];
    2. stringUtils::copy<WCHAR,CHAR>(lpString,"Convert from ansi!\n");

    2. Ghép chuỗi

    Ghép chuỗi "nguồn" vào sau chuỗi "đích"
    C++ Code:
    1. stringUtils::cat<T,T>( đích, nguồn)

    Ví dụ:
    C++ Code:
    1. WCHAR lpString[300];   
    2. stringUtils::copy<WCHAR,WCHAR>(lpString,L"Hello everybody... ");
    3. stringUtils::cat<WCHAR,WCHAR>(lpString,L"This is stringUtils");

    3. Chiều dài chuỗi
    C++ Code:
    1. stringUtils::length<T>( chuỗi )

    Ví dụ:
    C++ Code:
    1. WCHAR lpString[300];   
    2. stringUtils::copy<WCHAR,WCHAR>(lpString,L"Hello everybody... ");
    3.  
    4. // Trả vê chiều dài chuỗi unicode
    5. int len = stringUtils::length<WCHAR>(lpString);

    4. So sánh 2 chuỗi

    Ví dụ:
    C++ Code:
    1. int result = stringUtils::comp<char>("string A"," string B");

    Nếu:
    - result == 0 có nghĩa là 2 chuỗi giống nhau.
    - result > 0 thì chuỗi A > chuỗi B
    - result < 0 thí chuỗi A < chuỗi B

    Ứng dụng dùng để sắp xếp.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 14-12-2008 lúc 04:55 PM.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    II. Định dạng chuỗi

    1. Format

    C++ Code:
    1. stringUtils::format<char>(lpString,"Ta co: %d + %d = %d\n", 2,3,2+3);
    2. std::cout << lpString; // Ta co: 2 + 3 = 5

    2. Parse

    Bao gồm 4 function:
    C++ Code:
    1. // Chuyển chuỗi HEX thành int
    2. stringUtils::parseFromHex
    3.  
    4. // Chuyển chuỗi thành DWORD (unsigned int)
    5. stringUtils::parseToDWORD
    6.  
    7. // Chuyển chuỗi thành float
    8. stringUtils::parseToFloat
    9.  
    10. // Chuyển chuỗi thành Int
    11. stringUtils::parseToInt

    Tất cả các hàm này trả về false nếu không chuyển đổi được.
    Ví dụ:
    C++ Code:
    1. float f;
    2. stringUtils::parseToFloat<char>("1.0", &f);
    3.  
    4. int x;
    5. stringUtils::parseFromHex<char>("0xAC", &x);

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    III. Xử lý chuỗi

    1. Chuyển thành chữ hoa

    C++ Code:
    1. char lpString[300];
    2. stringUtils::copy<char,char>(lpString,"Hello everybody... ");  
    3. stringUtils::toUpper<char>(lpString);
    4.  
    5. std::cout << lpString;

    2. Chuyển thành chữ thường
    C++ Code:
    1. char lpString[300];
    2. stringUtils::copy<char,char>(lpString,"Hello everybody... ");  
    3. stringUtils::toLower<char>(lpString);
    4.  
    5. std::cout << lpString;

    3. Loại bỏ khoảng trống ở hai bên
    C++ Code:
    1. char lpString[300];
    2. stringUtils::copy<char,char>(lpString,"   Hello everybody...   ");
    3. stringUtils::trim<char>(lpString);
    4. // Chuyển "   Hello everybody...   " -> "Hello everybody..."
    5. std::cout << lpString;

    Ngoài ra có thể trimLeft (bỏ bên trái) và trimRight (bỏ bên phải)

    4. Mid (lấy chuỗi ở giữa)
    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3.  
    4. stringUtils::copy<char,char>(lpString,"Hello everybody...");
    5.  
    6. // Lấy từ ký tự số 0 và đếm 5 ký tự
    7. stringUtils::mid<char,char>(lpTemp, lpString, 0,5);
    8.  
    9. std::cout << lpString << "\n";
    10.  
    11. // Chuỗi Hello (vị trí 0 - 5)
    12. std::cout << lpTemp << "\n";

    5. Loại bỏ các ký tự trùng lặp

    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3.  
    4. stringUtils::copy<char,char>(lpString,"  Hello     everybody...   ");
    5.  
    6.  
    7. // Loai bỏ ký tự khoảng trắng bị lặp ' '
    8. // Chuyển "  Hello     everybody...   " -> " Hello everybody... "
    9. stringUtils::inorgeLoopChar<char>(lpString,' ');

    6. Tìm vị trí của một chuỗi trong chuỗi

    C++ Code:
    1. stringUtils::copy<char,char>(lpString,"Hello everybody...");
    2.  
    3. // at sẽ = 6 (vị trí chữ 'e' trong chuỗi lpString);
    4. DWORD at = stringUtils::find<char>(lpString, "everybody");

    Ngoài ra bạn có thể tìm từ 1 vị trí bắt đầu
    C++ Code:
    1. // Ví dụ bắt đầu từ ký tự số 2
    2. DWORD at = stringUtils::find<char>(lpString, "everybody", 2);

    Hàm này trả về -1 nếu không tìm thấy chuỗi.

    7. Lấy ký chuỗi nằm giữa block

    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3.  
    4. stringUtils::copy<char,char>(lpString,"Hello @everybody@......");
    5.  
    6. // at = 16 (ký tự '.' đằng sau @)
    7. DWORD at = stringUtils::getBlock<char,char>(lpTemp, lpString, "@");
    8.  
    9. std::cout << lpTemp << "\n"; // temp là chuỗi everybody

    Ngoài ra có thể tìm từ 1 vị trí
    C++ Code:
    1. // Ví dụ từ ký tự thứ 2
    2. DWORD at = stringUtils::getBlock<char,char>(lpTemp, lpString, "@", 2);

    Hàm này sẽ trả về -1 nếu ko tìm thấy block "@" hoặc chỉ tìm thấy 1 block.

    8. Lấy chuỗi ký tự nằm giữa 2 string block

    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3.  
    4. stringUtils::copy<char,char>(lpString,"void main(){printf('hehe');}");
    5. stringUtils::findBlock<char,char>(lpTemp, lpString, "{}");
    6.  
    7.  
    8. // Trả về chuỗi "printf('hehe');" ( nằm giữa block { } )
    9. std::cout << lpTemp << "\n";

    Ngoài ra nếu xuất hiện block con như sau:

    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3.  
    4. stringUtils::copy<char,char>(lpString,"void main(){if(1){printf('hehe');}}");
    5. stringUtils::findBlock<char,char>(lpTemp, lpString, "{}");
    6.  
    7. // Trả về "if(1){printf('hehe');}" nằm giữa block root
    8. std::cout << lpTemp << "\n";

    Function này sẽ trả về -1 nếu lỗi (có thể do { mà không đóng })

    9. Lấy chuỗi ký tự nằm giữa 2 tag block

    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3.  
    4. stringUtils::copy<char,char>(lpString,"<tagBegin>XML format</tagBegin>");
    5. stringUtils::findBlockString<char,char>(lpTemp, lpString, "<tagBegin>","</tagBegin>");
    6.  
    7. // Trả về chuỗi "XML format"
    8. std::cout << lpTemp << "\n";

    Bạn có thể ứng dụng cái này vào việc giải mã vì nó rất thông dụng

    10. Split

    C++ Code:
    1. char lpString[300];
    2. char lpTemp[300];
    3. DWORD i = 0;
    4.  
    5. stringUtils::copy<char,char>(lpString,"this|is@split*string|1|2|3");
    6. while ( stringUtils::split<char>(lpTemp, lpString, "|@*", &i) )
    7. {
    8.     std::cout << lpTemp << "\n";
    9. }

    Nó sẽ in ra như sau:
    Code:
    this
    is
    split
    string
    1
    2
    3
    stringUtils::split sẽ trả về false nếu không thể cắt ký tự được nữa.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 14-12-2008 lúc 04:49 PM.

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    III. Ứng dụng

    Một ví dụ kết hợp findBlock và split để biên dịch chuỗi "[const=10.00][k=20.01][t=5.40]" như sau:

    C++ Code:
    1. char lpString[300];
    2. char lpBlock[300];
    3. char lpSplit[300];
    4. int j;
    5. float val;
    6. DWORD i;
    7. bool bSplit;
    8.  
    9. stringUtils::copy<char,char>(lpString,"[const= 10.00] [k = 20.01][ t= 5.40] ");
    10.    
    11. j = stringUtils::findBlock<char,char>(lpBlock, lpString, "[]");
    12. while ( j != -1 )
    13. {
    14.     i = 0; 
    15.  
    16.     bSplit = stringUtils::split<char>(lpSplit, lpBlock, "=", &i );
    17.     // Lỗi ko tách được tên biến
    18.     if (bSplit == false)
    19.         continue;
    20.  
    21.     // Loại bỏ khoảng trắng
    22.     stringUtils::trim<char>(lpSplit);
    23.  
    24.     // Tên biến
    25.     std::cout << lpSplit << ":" ;  
    26.  
    27.     ////////////////////////////////////////////////////////////////////
    28.    
    29.     // Tách giá trị biến
    30.     bSplit = stringUtils::split<char>(lpSplit, lpBlock, "=", &i );
    31.     // Lỗi ko tách được giá trị biến
    32.     if (bSplit == false)
    33.         continue;
    34.  
    35.  
    36.     // Loại bỏ khoảng trắng
    37.     stringUtils::trim<char>(lpSplit);
    38.     if ( stringUtils::parseToFloat<char>( lpSplit, &val ) )
    39.         std::cout << val << "\n";
    40.     else
    41.         std::cout << "<cant parse>" << "\n";
    42.  
    43.  
    44.  
    45.     // Tìm block tiếp theo
    46.     j = stringUtils::findBlock<char,char>(lpBlock, lpString, "[]",j);
    47. }

    Kết quả
    Code:
    const:10
    k:20.01
    t:5.4

    Trên đây là những string function thường sử dụng mà mình share cho các bạn. Hy vọng sẽ giúp ích gì đó hơn cho các bạn trong việc lập trình.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 21-12-2008 lúc 12:17 PM.

  6. #6
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    Mặc định [C++String] Xử lý chuỗi với stringUtils

    Thư viện của bạn rất hay, sao không thấy có phần xử lý Regular Expression nhỉ.

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Thank Math-Info (Toán-Tin) đã góp ý.

    Tớ đang thêm một số Macro để g++ có thể chạy. Đồng thời bổ sung thêm vài hàm như Replace và Insert.

    Còn cái Regular Expression phải nói quên bén đi mất thì, cám ơn đã nhắc nhé, tớ chắn chắn sẽ làm chứ ko mấy bạn bên C# cứ hỏi sao C++ ko có!!!

    Tớ sẽ sớm cập nhật. Hà hà xong rồi tớ sẽ đóng gói thành 1 object String luôn cho RR biết .

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

  1. Bài tập C++ Xây dựng phương thức nối hai chuỗi của lớp string
    Gửi bởi baby_kute trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 03-12-2015, 08:10 AM
  2. cắt chuỗi qa 1 cụm string
    Gửi bởi quan321 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 26-11-2013, 10:17 PM
  3. Lập trình C++ Lỗi so sánh chuỗi kiểu string
    Gửi bởi darkboys trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 11-07-2013, 04:50 PM
  4. 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
  5. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM

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