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

Đề tài: Cấp phát bộ nhớ cho chuỗi qua hàm

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

    Mặc định Cấp phát bộ nhớ cho chuỗi qua hàm

    Hiz hiz mình có bài này mà mãi vẫn không tìm ra lỗi của nó, bạn nào biết làm ơn chỉ giúp mình sai ở đâu với, mình xin cảm ơn nhiều lắm T__T.
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. #include <stdlib.h>
    5.  
    6. int nhapChuoi( char **n)
    7. {
    8.     int a,i;
    9.     printf("\n nhap so luong chuoi ban muon: ");
    10.       scanf("%d",&a);
    11.       if((*n=(char*)malloc(a*sizeof(char)))== NULL)
    12.       {
    13.         printf("\n loi cap phat bo nho.");
    14.          getch();
    15.          exit(1);
    16.       }
    17.  
    18.       for(i=0; i<a; i++)
    19.       {
    20.         printf("\n Nhap chuoi  thu %d: ",i+1);
    21.         fflush(stdin);
    22.          gets(n[i]);
    23.       }
    24.  
    25.       for(i=0; i<a; i++)
    26.         {
    27.             printf("\n %s",n[i]);
    28.         }
    29.  
    30.    return a;
    31. }
    32.  /*
    33. void hienThi(char *n, int a)
    34. {
    35.     int i;
    36.         printf("\n in chuoi: ");
    37.         for(i=0; i < a; i++)
    38.          {
    39.             printf("\n chuoi thu %d: %s",i+1,n[i]);
    40.          }
    41.  
    42. }
    43. */
    44. void main()
    45. {
    46.     char *n;
    47.    int a,i;
    48.     a=nhapChuoi(&n);
    49.       //hienThi(n,a);
    50.  
    51.    getch();
    52.  
    53.  
    54. }

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    495

    Bạn có thể mô tả vấn đề rõ hơn không? Chương trình này làm gì? Hàm nhapChuoi() làm gì? Tham số n của nó là gì?

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

    À bài này mình dùng để cấp phát bộ nhớ cho 1 mảng chuỗi thông qua hàm, n ở đây là con trỏ 2 chiều dùng để cấp phát bộ nhớ cho chuỗi, nó chính là kiểu con trỏ không định giá trị tương đương với mảng 2 chiều không giới hạn kích thước. Không biết mình hiểu thế có đúng ko nữa.Hàm nhapChuoi() dùng để nhập chuỗi vào còn hàm hienThi() để biểu diễn chuỗi, bài này có cái đề dài mà mình bị vướng chỗ này nên chưa làm tiếp đc.Bạn có thể chỉ cho mình chỗ mình sai được không?

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    495

    Trích dẫn Nguyên bản được gửi bởi traitimbanggia Xem bài viết
    À bài này mình dùng để cấp phát bộ nhớ cho 1 mảng chuỗi thông qua hàm
    OK.
    Trích dẫn Nguyên bản được gửi bởi traitimbanggia Xem bài viết
    , n ở đây là con trỏ 2 chiều dùng để cấp phát bộ nhớ cho chuỗi,
    Cho chuỗi hay cho các chuỗi?
    Trích dẫn Nguyên bản được gửi bởi traitimbanggia Xem bài viết
    Hàm nhapChuoi() dùng để nhập chuỗi
    Mỗi lần gọi hàm nhập 1 chuỗi hay nhập nhiều chuỗi?

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

    Cho nhiều chuỗi mà ? Mọi khi vẫn cấp phát kiểu thế cho 1 loạt chuỗi mà có cần dùng đệ quy đâu? Mình lâu ngày không dùng nên quên mất mà T__T.Với lại bài này rõ ràng là mình cấp phát thành mảng rồi còn gì nữa nhỉ? tại sao lại chỉ có 1 chuỗi? sử dụng con trỏ 2 chiều rồi cơ mà? nó tương đương với mảng 2 chiều không xác định đúng không?

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    495

    Mặc định Cấp phát bộ nhớ cho chuỗi qua hàm

    Nếu thế thì n của nhapChuoi() phải trỏ đến là một bảng gồm a con trỏ (a là số do người dùng nhập vào) trong đó mỗi con trỏ lại trỏ đến 1 chuỗi mà người dùng sẽ nhập vào.

    Hàm nhapChuoi của bạn có mấy vấn đề thế này:

    - Không cấp phát bộ nhớ cho bảng con trỏ. malloc(a*sizeof(char)) cấp bộ nhớ cho a kí tự chứ không phải là a con trỏ.

    - Không cấp phát bộ nhớ cho từng chuỗi mà người dùng nhập vào. Hàm gets() không tự cấp phát bộ nhớ, bạn phải chuẩn bị bộ nhớ sẵn cho nó đủ lớn để có thể chứa được một chuỗi cực dài.

    - Không trả lại địa chỉ của bảng con trỏ đã tạo. Khai báo char** n là sai. Đúng ra phải là char ***n

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

    Ặc cấp phát con trỏ cấp 3 à? Cái này chưa từng dùng bao giờ cả, bạn demo cho mình 1 chút với con trỏ cấp 3 được không? Mình không biết phải truyền tham chiếu kiểu gì ở main nữa rồi :|

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    495

    Bạn cứ xử lý 3 vấn đề mà mình nêu ra trước đi. Về vấn đề thứ ba, chỗ nào trong hàm cần dùng n thì bạn viết là (*n), ví dụ (*n) = malloc(....), (*n)[i], (*n)[i][j], vân vân. Còn ở trong main() thì chữa khai báo thành char **n; còn lời gọi nhapChuoi(&n) thì đúng rồi. Rồi post code lên chúng ta sẽ thảo luận tiếp.

    Còn nếu không muốn viết kiểu ấy thì bạn có thể sửa đổi khai báo nhapChuoi(), hoán đổi tham số và giá trị trả về:

    char** nhapChuoi(int *a)
    {
    ...
    }

    Khi đó bạn sẽ không cần con trỏ 3 lần nữa mà chỉ cần 2 lần thôi.

  9. #9
    Ngày gia nhập
    01 2008
    Bài viết
    4

    Mình đã cố gắng khắc phục bằng cách chỉnh lại việc cấp phát bộ nhớ sẽ cho từng chuỗi nhưng vẫn chưa nắm được vấn đề nó là gì? Bạn có thể coi qua hộ mình được không?
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. #include <stdlib.h>
    5.  
    6. int nhapChuoi( char **n)
    7. {
    8.     int a,i;
    9.     printf("\n nhap so luong chuoi ban muon: ");
    10.       scanf("%d",&a);
    11.  
    12.    for(i=0; i<a; i++)
    13.    {
    14.       if((*n=(char*)malloc(a*sizeof(char)))== NULL)
    15.       {
    16.         printf("\n loi cap phat bo nho.");
    17.          getch();
    18.          exit(1);
    19.       }
    20.  
    21.       printf("\n nhap chuoi thu %d: ",i+1);
    22.       fflush(stdin);
    23.       gets(n[i]);
    24.     }
    25.  
    26. return a;
    27. }
    28.  
    29. void hienThi(char *n, int a)
    30. {
    31.     int i;
    32.         printf("\n in chuoi: ");
    33.         for(i=0; i < a; i++)
    34.          {
    35.             printf("\n chuoi thu %d: %s",i+1,n[i]);
    36.          }
    37.  
    38. }
    39.  
    40. void main()
    41. {
    42.     char *n;
    43.    int a;
    44.     a=nhapChuoi(&n);
    45.       hienThi(n,a);
    46.  
    47.    getch();
    48.  
    49.  
    50. }

  10. #10
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    495

    Mình sửa lại code của bạn:
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int nhapChuoi( char ***n)
    {
        int a,i;
    	char buf[100];
        printf("\n nhap so luong chuoi ban muon: ");
          scanf("%d",&a);
    
    	if((*n=(char**)malloc(a*sizeof(char*)))== NULL)
          {
            printf("\n loi cap phat bo nho.");
             getch();
             exit(1);
          }
        
       for(i=0; i<a; i++)
       {
          printf("\n nhap chuoi thu %d: ",i+1);
          fflush(stdin);
          gets(buf);
    	  if(((*n)[i] =(char*)malloc((strlen(buf)+1)*sizeof(char)))== NULL)
          {
            printf("\n loi cap phat bo nho.");
             getch();
             exit(1);
          }
    	  strcpy((*n)[i],buf);
        }
    
       return a;
    }
    
    void hienThi(char **n, int a)
    {
        int i;
            printf("\n in chuoi: ");
            for(i=0; i < a; i++)
             {
                printf("\n chuoi thu %d: %s",i+1,n[i]);
             }
    
    }
    
    void test(void)
    {
        char **n;
       int a;
        a=nhapChuoi(&n);
          hienThi(n,a);
    
       getch();
    }
    Chú ý. Mình giữ nguyên code gets() của bạn. Nếu nhập chuỗi dài hơn 99 kí tự, chương trình sẽ gặp một lỗi thường gọi là "bị chết" hay "bị treo". Bởi thế, không nên dùng gets() trong các ứng dụng thực tế trừ phi biết chắc chắn số kí tự tối đa.
    Đã được chỉnh sửa lần cuối bởi Ada : 10-05-2008 lúc 09:07 PM. Lý do: edit

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

  1. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  2. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  3. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 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: 06-08-2011, 08:25 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 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