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

Đề tài: Tối ưu hóa chuỗi trong lập trình C++, kết quả cho ra nhiều ký tự lạ?

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

    Mặc định Tối ưu hóa chuỗi trong lập trình C++, kết quả cho ra nhiều ký tự lạ?

    Đề bài là xóa các khoảng trắng thừa chỉ chừa lại 1 khoảng trắng giữa 2 từ, ví vụ chuỗi ban đầu:"<><><> Cong<><> Dong<><>C Viet<><><>" sau khi xóa xong: "Cong<>Dong<>C<>Viet", <> là dấu cách, bài của em xuất hiện nhiều ký tự lạ và bị lỗi khi chạy xong chương trình.
    C++ Code:
    1. #include<iostream>
    2. using namespace std;
    3. char *toiuuhoa(char s[])
    4. {
    5.     char *p=new char[100];
    6.     p=strtok(s," ");
    7.     char *kq=new char[100];
    8.     while(p!=NULL)
    9.     {
    10.         strcat(kq,p);
    11.         strcat(kq," ");
    12.         p=strtok(NULL," ");
    13.  
    14.     }
    15.     int n=strlen(kq);
    16.     kq[n-1]='\0';
    17.     return kq;
    18. }
    19. void inchuoi(char s[])
    20. {
    21.     int n=strlen(s);
    22.     for(int i=0;i<n;i++)
    23.         cout<<s[i];
    24.  
    25. }
    26. void main()
    27. {
    28.         char s[100]="    Cong      dong     C         Viet    ";
    29.         char *tam=toiuuhoa(s);
    30.         cout<<"Chuoi sau khi toi uu:";
    31.         inchuoi(tam);
    32. }
    Đã được chỉnh sửa lần cuối bởi Le thi Ngoc Lan : 09-05-2012 lúc 04:42 PM.

  2. #2
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Code:
    char *kq=new char[100];
    Chỗ này nó sẽ cấp mảng ký tự bất kỳ. có thể là kí tự kq[0] khác '\0'

    Vì vậy bạn phải làm cho C++ hiểu rằng đó là xâu rỗng bằng cách gán kq[0] là '\0'.

    Tham khảo
    http://diendan.congdongcviet.com/showthread.php?t=57695

  3. #3
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi Le thi Ngoc Lan Xem bài viết
    Đề bài là xóa các khoảng trắng thừa chỉ chừa lại 1 khoảng trắng giữa 2 từ, ví vụ chuỗi ban đầu:"<><><> Cong<><> Dong<><>C Viet<><><>" sau khi xóa xong: "Cong<>Dong<>C<>Viet", <> là dấu cách, bài của em xuất hiện nhiều ký tự lạ và bị lỗi khi chạy xong chương trình.
    C++ Code:
    1. #include<iostream>
    2. using namespace std;
    3. char *toiuuhoa(char s[])
    4. {
    5.     char *p=new char[100];
    6.     p=strtok(s," ");
    7.     char *kq=new char[100];
    8.     while(p!=NULL)
    9.     {
    10.         strcat(kq,p);
    11.         strcat(kq," ");
    12.         p=strtok(NULL," ");
    13.  
    14.     }
    15.     int n=strlen(kq);
    16.     kq[n-1]='\0';
    17.     return kq;
    18. }
    19. void inchuoi(char s[])
    20. {
    21.     int n=strlen(s);
    22.     for(int i=0;i<n;i++)
    23.         cout<<s[i];
    24.  
    25. }
    26. void main()
    27. {
    28.         char s[100]="    Cong      dong     C         Viet    ";
    29.         char *tam=toiuuhoa(s);
    30.         cout<<"Chuoi sau khi toi uu:";
    31.         inchuoi(tam);
    32. }
    1. Cho mình hỏi, chỗ nào là chỗ giải phóng bộ nhớ
    2. Tư tưởng này chạy quá tốn run-time

    Demo fix lại
    C++ Code:
    1. #include<iostream>
    2. using namespace std;
    3.  
    4. void xoacach(char *xau)
    5. {
    6.     int k=0;
    7.     for (int i=0;xau[i]!=NULL;i++)
    8.     {
    9.         if(xau[i]!=' ') xau[k++]=xau[i];
    10.         else if (k>0&&xau[i+1]!=' ') xau[k++]=xau[i];;
    11.     }
    12.     if (xau[k-1]==' ') xau[k-1]=NULL;
    13.     else xau[k]=NULL;
    14. }
    15.  
    16. void main()
    17. {
    18.     char s[100]="    Cong      dong     C         Viet    ";
    19.     xoacach(s);
    20.     cout<<"Chuoi sau khi toi uu:" <<s;
    21.     cin.get();
    22. }
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

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

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    1. Cho mình hỏi, chỗ nào là chỗ giải phóng bộ nhớ
    2. Tư tưởng này chạy quá tốn run-time

    Demo fix lại
    C++ Code:
    1. #include<iostream>
    2. using namespace std;
    3.  
    4. void xoacach(char *xau)
    5. {
    6.     int k=0;
    7.     for (int i=0;xau[i]!=NULL;i++)
    8.     {
    9.         if(xau[i]!=' ') xau[k++]=xau[i];
    10.         else if (k>0&&xau[i+1]!=' ') xau[k++]=xau[i];;
    11.     }
    12.     if (xau[k-1]==' ') xau[k-1]=NULL;
    13.     else xau[k]=NULL;
    14. }
    15.  
    16. void main()
    17. {
    18.     char s[100]="    Cong      dong     C         Viet    ";
    19.     xoacach(s);
    20.     cout<<"Chuoi sau khi toi uu:" <<s;
    21.     cin.get();
    22. }
    Em chạy trên DEV-C thì nó báo lỗi
    C++ Code:
    1. #include<iostream>
    2.  
    3. using namespace std;
    4.  
    5. void xoacach(char *xau)
    6. {
    7.     int k=0;
    8.     for (int i=0; xau[i]!= '\0' ;i++)
    9.     {
    10.         if(xau[i]!=' ') xau[k++]=xau[i];
    11.         else if (k>0&&xau[i+1]!=' ') xau[k++]=xau[i];;
    12.     }
    13.     if (xau[k-1]==' ') xau[k-1]='\0';
    14.     else xau[k]='\0';
    15. }
    16. int main()
    17. {
    18.     char s[100]="    Cong      dong     C         Viet    ";
    19.     xoacach(s);
    20.     cout<<"Chuoi sau khi toi uu:" <<s;
    21.     cin.get();
    22.     return 0;
    23. }

  5. #5
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    *Một cách khác:
    C Code:
    1. void remove_spaces(char *text)
    2. {
    3.        if(NULL == text)
    4.               return;
    5.  
    6.        char *pos = text;
    7.        while(*pos)
    8.        {
    9.               if(' ' == *pos)
    10.                      for(*text++ = *pos++; ' ' == *pos; ++pos);
    11.               *text++ = *pos++;
    12.        }
    13.        *text = '\0';
    14. }
    Nguyên mẫu đề của tôi không yêu cầu loại bỏ khoảng trắng cầu câu nên tôi code như thế, các bạn có thể edit lại một chút.
    * Update: edit một chút.

    C Code:
    1. void remove_spaces(char *text)
    2. {
    3.     if(NULL == text)
    4.         return;
    5.    
    6.     char *pos_1 = text;
    7.     char *pos_2 = text;
    8.    
    9.   while(*pos_2)
    10.   {
    11.     if(' ' == *pos_2)
    12.     {
    13.         if(text != pos_2)
    14.             *pos_1++ = *pos_2++;
    15.  
    16.         for(; ' ' == *pos_2; ++pos_2);
    17.     }
    18.     *pos_1++ = *pos_2++;
    19.   }
    20.  
    21.   if(' ' == pos_1[-2])
    22.     pos_1[-2] = '\0';
    23. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 22-05-2012 lúc 06:01 PM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

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

  1. Cách in hóa đơn nhiều liên trong lập trình ASP.NET
    Gửi bởi tuanphong trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 1
    Bài viết cuối: 02-05-2014, 05:21 PM
  2. Mã hóa chuỗi trong C#?
    Gửi bởi robinsonit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 15
    Bài viết cuối: 11-10-2012, 11:50 PM
  3. Câu lệnh sql inner join nhiều bảng dùng trong hóa đơn
    Gửi bởi lotus88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 03-07-2011, 05:10 PM
  4. Bài tập C tối ưu hóa chuỗi nhập từ bàn phím(xóa ký tự trắng thừa trong chuỗi)
    Gửi bởi kitti trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 27-10-2010, 07:11 PM
  5. Mã hóa chuỗi bằng các kiểu mã hóa ký tự trong lập trình C#
    Gửi bởi baokhanhk28 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 02-10-2008, 02:00 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