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

Đề tài: Hỏi về chuẩn hóa chuỗi ký tự trong MFC (VC++)

  1. #1
    Ngày gia nhập
    11 2006
    Nơi ở
    Tiền Giang
    Bài viết
    28

    Mặc định Hỏi về chuẩn hóa chuỗi ký tự trong MFC (VC++)

    Mình đang viết một chương trình nhỏ để tìm hiểu thêm về lớp CString. Em có 1 vài vấn đề muốn hỏi các bạn.

    + Vấn đề 1 :

    Ví dụ: Nhập vào chuỗi: " tOI la ai ? "
    Sẽ chuẩn hóa lại cho dễ đọc hơn: "Toi La Ai?"
    và đồng thời ctrình sẽ tách chuỗi này thành 3 tiếng : Toi, La, Ai và lưu vào 1 mảng kiểu CString.

    - Hàm chuẩn hóa chuỗi (theo ý tưởng của mìn) :

    Visual C++ Code:
    1. extern "C" __declspec (dllexport) CString Chuan_Hoa_Chuoi (CString strHoTen)
    2. {
    3.     strHoTen.TrimLeft();
    4.     int i=0;
    5.    
    6.     //Lay chieu dai chuoi
    7.     int cdai = strHoTen.GetLength();
    8.    
    9.     while (i <cdai-1)
    10.     {
    11.         char kytu = strHoTen[i];
    12.         if ( (strcmp(kytu, strHoTen[i+1])==0) && (strcmp(kytu, " ")==0))
    13.             strHoTen = strHoTen.Delete(i-1,1);
    14.         i ++;
    15.     }
    16.     strHoTen.TrimRight();
    17.     return strHoTen;
    18. }

    Và nó báo lỗi ngay tại dòng màu đỏ. Không biết phải fix làm sao ? Mong các bạn chỉ giúp !

    Với lại mình không biết thuật toán làm cho ký tự đầu tiên của mỗi từ (mỗi chuỗi con) viết hoa và tách chuỗi này này ra làm các chuỗi con.

    + Vấn đề 2 :

    Mình hỏi 1 vấn đề, giả sử mình có đoạn code như sau :

    Visual C++ Code:
    1. CString str;
    2. while (i < str.GetLegth())
    3. {
    4.     CString temp = str[i];
    5.     if (điều kiện gì đó)
    6.     {
    7.         str = str.Delete (i,1);
    8.         //......
    9.     }
    10.     i ++;
    11. }

    Mình hỏi là khi delete 1 ký tự trong chuỗi str thì chiều dài của
    chuỗi str và vị trí thứ i mình đang xét có thay đổi không ạ.

    Ví dụ :
    Mình có chuỗi str = "Em la sinh vien"
    thì chiều dài chuỗi là 18 (i chạy từ 0 đến 17)
    Và điều kiện mình là mỗi lần duyệt em xóa 1 ký tự và nếu nó là
    trắng thì xóa nó đi.
    Và khi duyệt đến lần thứ i và ký tự tại i là khỏang trắng thì ta
    xóa, sau khi xóa, chỉ số i có như cũ hay là ta phải cập nhật lại i =
    i - 1 không ạ.


    PS : Do mới tìm hiểu VC++ trong thời gian ngắn, nên còn có quá nhiều thứ không biết, phiền các bạn nhín chút thời gian giúp mình nha.

    Cám ơn các bạn rất nhiều
    Đã được chỉnh sửa lần cuối bởi huyfeng : 01-04-2008 lúc 03:35 PM.

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Bạn có thể sử dụng CString::GetAt(int index) để lấy ra 1 ký tự trong 1 chuỗi bất kỳ :
    Ví dụ :
    Visual C++ Code:
    1. CString s = "Hello World!";
    2. ASSERT (s.GetAt(5) == 'o');
    Và với CString::SetAt( int nIndex, TCHAR ch ) thì bạn có thể thay đổi 1 ký tự bất kỳ trong chuỗi.
    Tới đây mọi thứ dễ dàng hơn rồi phải không nào , bạn thử đi
    Đã được chỉnh sửa lần cuối bởi Tab : 30-03-2008 lúc 08:16 PM.
    What you see is never what you get...

  3. #3
    Ngày gia nhập
    11 2006
    Nơi ở
    Tiền Giang
    Bài viết
    28

    Ok, thanks bạn void main(). Mình đã làm được cái đoạn xén khoảng trắng của chuỗi rồi (chuẩn hóa) chuỗi. Mình đang vướn cái đoạn mà làm cho mỗi ký tự đầu của từ trong chuỗi là hoa.

    Code:
    extern "C" __declspec (dllexport) CString Proper (CString strHoTen)
    {
    	strHoTen.MakeLower();
    	if (strHoTen.GetLegth() <=1) 
    strHoTen.MakeUpper();
    	for(int i=1;i<strHoTen.GetLength();i++) 
    {
    CString temp = strHoTen[i];
    		if(strHoTen[i-1]=='  ')
    			temp.MakeUpper(); 
    }
    	return str;
    }
    bạn void main() cho mình ý kiến nha

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Việc chuẩn hóa chuỗi của bạn chỉ đơn giản là thế này:
    Visual C++ Code:
    1.     CString s = "hello Windows xP";
    2.     s.SetAt(0,toupper(s.GetAt(0))); // Ky tu dau tien
    3.     for (int i = 0 ; i < s.GetLength() - 1 ; i ++)
    4.     {
    5.         if (s.GetAt(i) == ' ')
    6.         {  
    7.             s.SetAt(i+1,toupper(s.GetAt(i+1)));        
    8.         }
    9.     }
    10.     AfxMessageBox(s);
    Đã được chỉnh sửa lần cuối bởi Tab : 30-03-2008 lúc 09:31 PM.
    What you see is never what you get...

  5. #5
    Ngày gia nhập
    11 2006
    Nơi ở
    Tiền Giang
    Bài viết
    28

    OK, mình đã làm và test rồi. Working !


    Visual C++ Code:
    1. CString s = "hello Windows xP";
    2.     s.SetAt(0,toupper(s.GetAt(0))); // Ky tu dau tien
    3.     for (int i = 0 ; i < s.GetLength() - 1 ; i ++)
    4.     {
    5.         if (s.GetAt(i) == ' ')
    6.         {  
    7.             s.SetAt(i+1,toupper(s.GetAt(i+1)));        
    8.         }
    9.     }
    10.     AfxMessageBox(s);

    Ngay chỗ mình tô đỏ, mình thay thế như sau không void main () được không nhỉ :

    Visual C++ Code:
    1. CString s = "hello Windows xP";
    2.     s.SetAt(0,s[0] - 32)); // Ky tu dau tien
    3.     for (int i = 0 ; i < s.GetLength() - 1 ; i ++)
    4.     {
    5.         if (s.GetAt(i) == ' ')
    6.         {  
    7.             s.SetAt(i+1,s[i+1] - 32));        
    8.         }
    9.     }
    10.     AfxMessageBox(s);
    Đã được chỉnh sửa lần cuối bởi huyfeng : 31-03-2008 lúc 07:33 PM.

  6. #6
    Ngày gia nhập
    11 2006
    Nơi ở
    Tiền Giang
    Bài viết
    28

    Mặc định Hỏi về chuẩn hóa chuỗi ký tự trong MFC (VC++)

    Tó code xong hàm Tách chuỗi (tách các tiếng trong chuỗi ra).

    Visual C++ Code:
    1. EXPORT void Tach_Chuoi(CString strHoTen, CString &strArray[], int &index)
    2. {
    3.     int n = strHoTen.GetLength();
    4.     int i = 0, j=0;
    5.     index = 0;
    6.     while(i <n -1)
    7.     {
    8.         if (strHoTen.GetAt(i) == ' ')
    9.         {
    10.             strArray[index] = strHoTen.Mid(j,i - j);
    11.             index ++;
    12.             j = i +1;
    13.         }
    14.         i++;
    15.     }
    16. }

    void main () xem giúp tớ. Tớ muốn sau khi tách tiếng ra, các tiếng được lưu trong mảng strArray, nên tớ dùng dạng tham chiếu &. Nhưng nếu dùng dạng này nó báo lỗi tại dòng tô đỏ.
    Đã được chỉnh sửa lần cuối bởi huyfeng : 31-03-2008 lúc 07:32 PM.

  7. #7
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Tách "chuỗi" thì dùng luôn hàm strtok đi bạn.

  8. #8
    Ngày gia nhập
    10 2009
    Bài viết
    1

    mình cũng đang làm một bài như thế nhưng chưa tìm được code cuối cùng, mong mọi người chỉ bảo mình với! :(

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

  1. Bài tập về chuẩn hóa chuỗi
    Gửi bởi thongnlkh_aptech trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 22
    Bài viết cuối: 29-04-2014, 12:11 AM
  2. Algorithm Chuyển code tách chuỗi , chuẩn hóa trong văn bản TV từ VB sang C#?
    Gửi bởi gvkatashi01 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 18-11-2013, 05:24 PM
  3. Chuẩn hóa chuỗi!!! Help
    Gửi bởi pato24193 trong diễn đàn Nhập môn lập trình Java
    Trả lời: 1
    Bài viết cuối: 02-01-2013, 09:32 PM
  4. Lập trình C Không hiểu ý nghĩa thuật toán nối liền 2 dấu cách liền nhau trong chuẩn hóa chuỗi
    Gửi bởi giang92 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 06-12-2011, 11:42 PM
  5. Bài tập C Tách và chuẩn hóa họ tên từ chuỗi
    Gửi bởi bachdev trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 02-11-2011, 08:16 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