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

Đề tài: Xử lý xâu ký tự hiệu quả trong C++???

  1. #1
    Ngày gia nhập
    11 2012
    Bài viết
    5

    Mặc định Xử lý xâu ký tự hiệu quả trong C++???

    Chào các bác, trong quá trình học cho đến hiện tại, vấn đề em gặp nhiều rắc rối nhất chính là việc xử lý các xâu ký tự. Dĩ nhiên là có nhiều dạng bài tập như chèn, xóa, sửa ký tự, sao chép, gắn nối... Nhưng có 2 dạng bài tập mà em hay gặp như sau:
    - Dạng 1: nhập hay đọc từ file các xâu dạng unformatted data, chuẩn hóa xâu thành dạng mong muốn. Ví dụ: nhập 1 xâu 234 vsdf3443 (=`` ***'##!32 13Dsv345 chuẩn hóa thành Vsdf Dsv (loại bỏ các ký tự ko phải chữ cái, chỉ để lại 1 khoảng trắng giữa các từ, xóa khoảng trắng 2 đầu, viết hoa,...)
    - Dạng 2: đọc từ file các xâu dạng formatted data và lấy dữ liệu từ các xâu đó. Ví dụ: file dulich.txt có dạng
    Code:
    Vung Tau     456      789      500$
    Đối với em, thông thường em sẽ xử lý bằng cách đọc từ đầu đến cuối xâu (đọc ngược em ko biết làm thế nào để chèn vào cuối cho hiệu quả), gặp ký tự thỏa mãn điều kiện thì chép vào. Tuy nhiên cách này làm cho hàm có rất nhiều câu lệnh rẽ nhánh, không thật sự hiệu quả.
    Điều em muốn hỏi là khi các bác gặp những trường hợp như trên, thì sẽ xử lý như thế nào, nếu có thể xin các bác trình bày luôn bằng code.
    Đã được chỉnh sửa lần cuối bởi phongdt : 28-11-2012 lúc 11:36 PM.

  2. #2
    Ngày gia nhập
    11 2012
    Bài viết
    136

    mình thấy các ví dụ bạn nêu thường sẽ đưa xâu về dạng bỏ kí tự trắng đầu và cuối và các kí tự trắng thừa ở giữa để mỗi từ sẽ cách nhau một kí tự giống như việc nhập tên mà để dấu cách lung tung, sau đó chuẩn hóa xâu để sử lý cho những việc tiếp theo. Mình có một đoạn code cùi không biết có giúp được gì không nhưng cứ post vậy . thuật toán nó cũng đơn giản là việc cắt đầu cắt đuôi xong thì cắt khoảng trắng thừa ở giữa.
    C Code:
    1. void xoa_ki_tu_thua(char *s)
    2. {
    3.     int i=0;
    4.     while(s[i]==' ')
    5.          ++i;
    6.     strcpy(s,s+i);
    7.     i=strlen(s)-1; 
    8.     while(s[i]==' ')
    9.         --i;
    10.     s[i+1]='\0';
    11.     //cat ki tu trang ben trong
    12.     int j=0;
    13.     for(int i=0;i<strlen(s);++i)
    14.     {
    15.       if(s[i]==' ')
    16.       {
    17.         j=i;
    18.         while(s[j+1]==' ')
    19.           ++j;
    20.         if(i!=j)
    21.         strcpy(s+i,s+j);
    22.       }
    23.     }
    24.     return;
    25. }
    26. Trong C++ có kiểu string hay lắm nhưng mình không thạo lắm nên dùng kiểu char theo kiểu C thôi.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  3. #3
    Ngày gia nhập
    02 2010
    Bài viết
    113

    út kém về pa cái xử lí chuỗi
    Dạng 1:
    Nên xóa những kí tự đặc biệt trước chỉ để lại những kí tự thỏa yêu cầu!!!
    Sau đó ta sẽ sử dụng hàm chuyển kí tự thành in hoa(chỉ kí tự bắt đầu của 1 từ thoy)
    C Code:
    1. #include <ctype.h>
    2. int toupper( int ch );
    rồi kiểm tra xem kí tự đầu và cuối có phải là khoảng trắng không!!! đúng thì ta xóa!!!

  4. #4
    Ngày gia nhập
    11 2012
    Bài viết
    5

    Chào các bác, đây là một hàm cắt khoảng trống ở 2 đầu xâu rất gọn và hiệu quả mà em vừa tìm thấy trên mạng

    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <algorithm>
    4.  
    5. using namespace std;
    6.  
    7. // Chi cat bo dau duoi
    8. inline string trim(string& str)
    9. {
    10. str.erase(0, str.find_first_not_of(' '));       //prefixing spaces
    11. str.erase(str.find_last_not_of(' ')+1);         //surfixing spaces
    12. return str;
    13. }
    14.  
    15. // Cat bo toan bo cac khoang trang
    16. inline string trim2 (string& str){
    17. str.erase(remove(str.begin(), str.end(), ' '), str.end());
    18. return str;
    19. }
    20.  
    21. // Cat bo khoang trang o trong xau, van de lai khoang trang ơ dau xau
    22.  
    23. string trim3 (string& str){
    24. int size = str.length();
    25.    for(int i = 0; i<size; i++){
    26.       if (str[i] == ' ' && str[i+1] == ' '){
    27.          str.erase(str.begin()+i);
    28.          size--;
    29.          i--;
    30.       }
    31.    }
    32. }
    33.  
    34. // Cat bo cac khoang trang thua, van de lai khoang trang giua 2 tu
    35. string trim4 (string& str){
    36. int size = str.length();
    37.     for(int j = 0; j<=size; j++)
    38.     {
    39.         for(int i = 0; i <=j; i++)
    40.         {
    41.             if(str[i] == ' ' && str[i+1] == ' ')
    42.             {
    43.                 str.erase(str.begin() + i);
    44.             }
    45.             else if(str[0]== ' ')
    46.             {
    47.                 str.erase(str.begin());
    48.             }
    49.             else if(str[i] == '\0' && str[i-1]== ' ')
    50.             {
    51.                 str.erase(str.end() - 1);
    52.             }
    53.         }
    54.     }
    55. return str;
    56. }
    57.  
    58. int main()
    59. {
    60.      string s = "    Viet        Nam             ";
    61.      string t = "Ha Long    ";
    62.      string q = "       Vung Tau";
    63.      trim(s);
    64.      trim(t);
    65.      trim(q);
    66.      cout<<s<<endl<<t<<endl<<q<<endl;
    67.      cout<<s.length()<<" "<<t.length()<<" "<<q.length();
    68.      return 0;
    69. }
    Đã được chỉnh sửa lần cuối bởi phongdt : 16-12-2012 lúc 09:42 PM.

  5. #5
    Ngày gia nhập
    11 2012
    Bài viết
    5

    Chào các bác, dạng bài ở ví dụ thứ 2, ví dụ ta cần đọc 1 file dữ liệu có công thức trên từng dòng như sau:
    Code:
    tên (char*), gioi tinh (bool), ngày tháng năm sinh (int.int.int), luong (long.000)
    nói chung là dạng mixed data, thì nên xử lý thế nào cho hiệu quả.
    Ví dụ đọc 1 dòng như sau vào 1 object có dạng (char*, bool, int, int, int, unsigned long)
    Code:
    Nguyen Van Long      1       23.09.77        10.000
    Cảm ơn các bác .

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

  1. Trả lời: 0
    Bài viết cuối: 22-06-2012, 08:57 PM
  2. Trả lời: 0
    Bài viết cuối: 22-06-2012, 07:52 PM
  3. Trả lời: 0
    Bài viết cuối: 22-06-2012, 07:50 PM
  4. Trả lời: 0
    Bài viết cuối: 22-06-2012, 07:49 PM
  5. Bài tập C++ Lỗi trong chương trình quản lý cb,CT chạy bt nhưng kết quả tính lương sai
    Gửi bởi Mr.vu112 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 13
    Bài viết cuối: 02-12-2011, 10:47 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