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ì?
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:
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> int nhapChuoi( char **n) { int a,i; { getch(); exit(1); } for(i=0; i<a; i++) { } for(i=0; i<a; i++) { } 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 main() { char *n; int a,i; a=nhapChuoi(&n); //hienThi(n,a); getch(); }
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ì?
À 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?
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?
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
Ặ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 :|
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.
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:
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> int nhapChuoi( char **n) { int a,i; for(i=0; i<a; i++) { { getch(); exit(1); } } return a; } void hienThi(char *n, int a) { int i; for(i=0; i < a; i++) { } } void main() { char *n; int a; a=nhapChuoi(&n); hienThi(n,a); getch(); }
Mình sửa lại code của bạn:
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.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(); }
Đã được chỉnh sửa lần cuối bởi Ada : 10-05-2008 lúc 09:07 PM. Lý do: edit