Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 40 kết quả

Đề tài: Xóa bỏ khoảng trắng ở đầu chuỗi và cuối chuỗi. Tại sao không xóa được khoảng trắng?

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

    Red face Xóa bỏ khoảng trắng ở đầu chuỗi và cuối chuỗi. Tại sao không xóa được khoảng trắng?

    Anh chị giúp em bài này với em làm mãi mà không được:
    Xóa bỏ khoảng trắng ở đầu chuỗi và cuối chuỗi.Em làm đầu chuỗi trước, anh chị sửa giùm em rồi em tự làm với cuối chuỗi.
    Đây là code của em ạ:

    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "string.h"
    4. void main()
    5. {
    6. clrscr();
    7. int i=0;
    8. char chuoi[30];
    9. printf("nhap vao chuoi:");
    10. gets(chuoi);
    11. while (i==' ')
    12. {
    13.      chuoi[i]=chuoi[i+1];
    14.      i++;
    15. }
    16. puts(chuoi);
    17. getch();
    18. }

    Anh chị xem em sai ở đâu được ko ạ. Em chạy được nhưng nó không xóa khoảng trắng huhu
    Đã được chỉnh sửa lần cuối bởi peterdrew : 20-06-2010 lúc 10:53 AM. Lý do: Đặt code vào thẻ!

  2. #2
    Ngày gia nhập
    05 2010
    Nơi ở
    Cách Mạng Tháng 8
    Bài viết
    205

    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "string.h"
    4. void main()
    5. {
    6. clrscr();
    7. int i=0;
    8. char chuoi[30];
    9. printf("nhap vao chuoi:");
    10. gets(chuoi);
    11.  
    12. //while (i==' ')    // i là chỉ số, sao lại đem so với ký tự trong chuỗi nhỉ.
    13. while (chuoi[i] == ' ')
    14. {
    15.      chuoi[i]=chuoi[i+1];
    16.      i++;
    17. }
    18. puts(chuoi);
    19. getch();
    20. }



    Trên diễn đàn có rất nhiều bài về vấn đề này, sao bạn không search nhỉ.

    Nothing last forever !!

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

    Vâng em cảm ơn anh . Em cũng search rồi nhưng moi người đều dùng hàm Trim mà em thì chưa được học ạ!!!

    À xin lỗi anh! Cho em hỏi thêm là em nhập vào : __thang(_ la dau' ' ')
    nhưng kết quả in ra lại là : tthang
    em gán giá trị cuối cùng = NULL rồi nhưng nó vẫn báo lỗi.
    em gán thế này nè : chuoi[strlen(chuỗi)]='NULL';
    đây là code của em nhờ anh chỉnh sửa hộ ạ :

    C Code:
    1. void main()
    2. {
    3. clrscr();
    4. int i=0;
    5. char chuoi[30];
    6. printf("nhap vao chuoi:");
    7. gets(chuoi);
    8. while (chuoi[i]==' ')
    9. {
    10. chuoi[i]=chuoi[i+1];
    11. chuoi[strlen(chuoi)]='NULL';
    12. i++;
    13. }
    14. for(i=0;i<strlen(chuoi);i++)
    15. printf("%s",chuoi[i]);
    16. getch();
    17. }

    Thanks anh rất nhiều ^^

  4. #4
    Ngày gia nhập
    05 2010
    Nơi ở
    Cách Mạng Tháng 8
    Bài viết
    205

    Trích dẫn Nguyên bản được gửi bởi nhatacocon Xem bài viết
    Vâng em cảm ơn anh . Em cũng search rồi nhưng moi người đều dùng hàm Trim mà em thì chưa được học ạ!!!

    Hàm trim đó là mấy bạn trên diễn đàn mình tự viết chứ ai dạy mà học.



    Bạn thấy anh Peter nói rùi đấy, không chịu đọc sách.
    Kiến thức cơ bản bị hổng, NULL là một hằng số, bạn để vào dấu nháy đơn thì báo lỗi là phải rồi. Vả lại, ở đây dùng chữ NULL cũng không đúng khái niệm, mặc dù giá trị đúng là 0.
    Bạn xem nhé
    C Code:
    1. #define space ' '
    2. void ltrim (char *s) // xoá kí tự trống đầu chuỗi
    3. {
    4. // không dùng con trỏ
    5.     int i = 0, n = strlen (s) ;
    6.     while (s[i] == space)
    7.         i++ ;
    8.     if (i != 0) {
    9.         strcpy (s, s + i) ;
    10.     /* hoặc không dùng hàm thư viện:
    11.         for (int j = 0 ; i <= n ; i++, j++)
    12.             s[j] = s[i] ;
    13.     */
    14.     }
    15. /*
    16. // Cách này dùng con trỏ, nhanh hơn
    17.     char *p = s ;
    18.     while (*p == space)
    19.         p++ ;
    20.     if (p != s)
    21.         strcpy (s, p) ;
    22. */
    23. }
    24.  
    25. void rtrim (char *s) // xoá các ký tự trống cuối chuỗi
    26. {
    27.     int i = strlen (s) - 1 ;
    28.     while (s[i] == space && i >= 0)
    29.         i-- ;
    30. // Lưu ý chỗ này nhé, không phải 'NULL' đâu
    31.     s[i+1] = 0 ; // hoặc s[i+1] = '\0' ;
    32. }
    Nothing last forever !!

  5. #5
    Ngày gia nhập
    05 2010
    Bài viết
    265

    Nếu không dùng thư viện string.h thì có thể làm như vầy:
    C Code:
    1. #include <stdio.h>
    2. #define space 32
    3.  
    4. char * ltrim (char s[])
    5. {
    6.     while (*s == space) s++;
    7.     return s;
    8. }
    9.  
    10. char * rtrim (char s[])
    11. {
    12.     int i = 0;
    13.     while (s[i]) i++ ;
    14.     while (s[i-1]==space) i--;
    15.     s[i] = 0 ;
    16.     return s;  
    17. }
    18.  
    19. void main()
    20. {
    21.     char s[] = "    ba ba beo   ", *p;
    22.     printf("\nCac dau '!' them vao de danh dau dau va cuoi xau.\nXau ban dau: !%s!",s);
    23.  
    24.     printf("\nDa bo di cac space phia dau: !%s!",p = ltrim(s));
    25.     printf("\nDa bo di cac space phia sau: !%s!\n",p = rtrim(p));
    26. }

  6. #6
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Mặc định Xóa bỏ khoảng trắng ở đầu chuỗi và cuối chuỗi. Tại sao không xóa được khoảng trắng?

    Trích dẫn Nguyên bản được gửi bởi nhatacocon Xem bài viết
    Em cũng search rồi nhưng moi người đều dùng hàm Trim mà em thì chưa được học ạ!!!
    Thư viện chuẩn lấy đâu ra hàm Trim nhỉ?

    Tổng hợp code của donvuon cho ta hàm Trim như sau: (Hàm này sẽ cắt các khoảng trắng tại hai đầu chuỗi s)
    C Code:
    1. char* Trim (char s[])
    2. {
    3.     int i = 0;
    4.     while (s[i]) i++ ;
    5.     while (s[i-1]==32 /* Hoặc ' ' */) i--;
    6.     s[i] = 0 ;
    7.     while (*s == 32 /* Hoặc ' ' */) s++;
    8.     return s;
    9. }
    Hoặc là:
    C Code:
    1. char* Trim (char s[])
    2. {
    3.     return LTrim(RTrim(s));  //Hoặc RTrim(LTrim(s))
    4. }
    Và hàm LTrim dùng để cắt các khoảng trắng phía trái của chuỗi:
    C Code:
    1. char* LTrim (char  s[])
    2. {
    3.     while (*s == 32 /* Hoặc ' ' */) s++;
    4.     return s;
    5. }
    Và hàm RTrim dùng để cắt các khoảng trắng phía phải của chuỗi:
    C Code:
    1. char* RTrim (char  s[])
    2. {
    3.     int i = 0;
    4.     while (s[i]) i++ ;
    5.     while (s[i-1]==32 /* Hoặc ' ' */) i--;
    6.     s[i] = 0 ;
    7.     return s;  
    8. }
    Vận dụng:
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. char* Trim (char s[])
    5. {
    6.     int i = 0;
    7.     while (s[i]) i++ ;
    8.     while (s[i-1]==32 /* Hoặc ' ' */) i--;
    9.     s[i] = 0 ;
    10.     while (*s == 32 /* Hoặc ' ' */) s++;
    11.     return s;
    12. }
    13. char* LTrim (char  s[])
    14. {
    15.     while (*s == 32 /* Hoặc ' ' */) s++;
    16.     return s;
    17. }
    18. char* RTrim (char  s[])
    19. {
    20.     int i = 0;
    21.     while (s[i]) i++ ;
    22.     while (s[i-1]==32 /* Hoặc ' ' */) i--;
    23.     s[i] = 0 ;
    24.     return s;  
    25. }
    26. int main()
    27. {
    28.     char s[100];
    29.     gets(s);
    30.     puts("Cat cac khoang trang Dau va Cuoi cua Chuoi");
    31.     puts(Trim(s));
    32.     puts("Cat cac khoang trang ben trai cua Chuoi");
    33.     puts(LTrim(s));
    34.     puts("Cat cac khoang trang ben phai cua Chuoi");
    35.     puts(RTrim(s));
    36.     getch();
    37.     return 0;
    38. }
    Đã được chỉnh sửa lần cuối bởi peterdrew : 20-06-2010 lúc 06:01 PM.

  7. #7
    Ngày gia nhập
    06 2010
    Bài viết
    4

    Vâng bác peterdrew va bác donvuon giảng rất dễ hiểu ạ. Các bác cho em hỏi thêm là với bài toán gặp kí tự bất kì. VD gặp kí tự 's' thì bỏ đi cũng làm tương tự phải không ạ!!!

  8. #8
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. char*  Xoa1KytuBatky(char s[], char c)
    5. {
    6.     int n= strlen(s);
    7.     for(int i=0;i<n;i++)
    8.     {
    9.         if(s[i]==c)
    10.         {
    11.             for(int j=i;j<n;j++)
    12.                 s[j]=s[j+1];
    13.             s[n--]='\0';
    14.             i--;
    15.         }
    16.     }
    17.     return s;
    18. }
    19. int main()
    20. {
    21.     char s[100];
    22.     gets(s);
    23.     puts("Chuoi sau khi xoa ky tu s la:");
    24.     puts(Xoa1KytuBatky(s,'s'));
    25.     getch();
    26.     return 0;
    27. }
    Thử thế này xem! Nhưng thú thực dùng string là mệt hơn....
    Đã được chỉnh sửa lần cuối bởi peterdrew : 20-06-2010 lúc 07:53 PM.

  9. #9
    Ngày gia nhập
    05 2010
    Nơi ở
    Cách Mạng Tháng 8
    Bài viết
    205


    Em có kiến nghị hàm LTrim, viết như thế này
    C Code:
    1. char* LTrim (char  s[])
    2. {
    3.     while (*s == 32 /* Hoặc ' ' */) s++;
    4.     return s;
    5. }
    nếu chuỗi s nguồn được cấp phát động thì sao giải phóng được.
    Nothing last forever !!

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    LTrim của cậu mà đi free(s) trả về thì chắc chắc 99% là die chứ sao. Cơ chế quản lý memory của OS và C/C++ RTL rất phức tạp, cho gì thì trả đấy.

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

  1. Hàm xóa khoảng ở đầu chuỗi không xóa hết khoảng trắng
    Gửi bởi taymonquang trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 5
    Bài viết cuối: 07-11-2011, 01:01 PM
  2. nhập chuỗi xóa khoảng trắng thừa
    Gửi bởi ngoctrungbmt 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: 21-01-2011, 11:54 PM
  3. Xóa bỏ khoảng trắng trong chuỗi
    Gửi bởi boy_popping trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 22-07-2010, 03:56 PM
  4. Xóa khoảng trắng ở đầu chuỗi
    Gửi bởi aydada trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 23-04-2010, 03:26 PM
  5. Xóa khoảng trắng trong chuỗi với lập trình C#
    Gửi bởi hieudiep trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 11
    Bài viết cuối: 18-10-2009, 03:58 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