Tôi mới làm quen với C và vẫn còn rất yếu trong việc sử dụng và hiểu con trỏ (đặc biệt là con trỏ void). Tôi đang cố gắng viết một hàm tải dữ liệu từ một tệp và lưu trữ dữ liệu đó trong một mảng con trỏ null, sao cho mỗi phần tử của mảng (trong trường hợp này) có một chuỗi từ dòng đó của tệp. Tôi nghi ngờ có một số vấn đề với mã:
- Tôi không chắc liệu mình có đang sử dụng *voidArray[] đúng cách làm một trong các tham số của hàm hay không.
- Tôi không chắc liệu strcpy() có phải là cách tốt để sao chép nội dung của bộ đệm dòng sang phần tử mảng có liên quan hay không.
- Tôi không biết cú pháp chính xác cho mục tiêu của strcpy() (tức là phần tử có liên quan trong mảng con trỏ void).
Cũng có thể có những lỗi khác, nhưng đây là ba lỗi mà tôi rất không chắc chắn.
Đây là chức năng của tôi:
void *readData(void *voidArray[], const char *filename, intlines) {
TẬP TIN *stream = fopen(tên tệp, "r");
if (luồng == NULL) {
perror("Lỗi tải file");
return 1;
}
char lineBuffer[BUFFER_SIZE];
int i = 0;
while(!feof(stream)) {
while(fgets(lineBuffer, sizeof(lineBuffer), luồng)) {
// *voidArray[i] = malloc(strlen(lineBuffer) + 1); // có lẽ không phải thứ tôi muốn
strcpy(*voidArray[i], lineBuffer);
i++;
}
}
fclose(luồng);
}
...đây là sự khởi đầu của main(), trong đó (một lần nữa) tôi không chắc cú pháp đúng để khai báo (và khởi tạo?) một mảng là gì:
int main(void)
{
dòng int = 20;
void *vararray[lines];
// varray = malloc(sizeof(char *) *lines); // có lẽ không phải thứ tôi muốn
readData(vararray[lines], FILENAME,lines); // FILENAME đã khai báo trước đó
Một số bản sửa lỗi mã được đề xuất sẽ được đánh giá rất cao (đặc biệt nếu tôi hoàn toàn bỏ lỡ một cách tiếp cận phù hợp hơn), nhưng tôi cảm thấy điều tôi cần hơn làTại saoMột lời giải thích tốt về những gợi ý này là chính xác. Tôi nghĩ nếu tôi có thể giải quyết vấn đề này - trường hợp xấu nhất - tôi sẽ hiểu rõ về điều tôi vẫn cần phải dạy cho bản thân: con trỏ. Cảm ơn trước vì bất kỳ trợ giúp hoặc nhận xét nào cũng như sự kiên nhẫn của bạn khi đọc đến đây.
EDIT: Câu trả lời của Joachim Pileborg rất hữu ích, nhưng tôi vẫn thiếu điều gì đó cơ bản (có thể là hiển nhiên). Đây là chức năng sửa đổi của tôi:
void *loadData(void *voidArray, const char *filename, intlines) {
TẬP TIN *stream = fopen(tên tệp, "r");
if (luồng == NULL) {
perror("Lỗi tải file");
}
char lineBuffer[BUFFER_SIZE];
int i = 0;
while(fgets(lineBuffer, sizeof(lineBuffer), luồng)) {
strcpy((voidArray+i), lineBuffer);
printf("voidArray: %s\n", (char *)(voidArray+i));
i++;
}
for (i = 0; i < dòng; i++) {
printf("phần tử mảng %d: %s\n", i, (char *)(voidArray+i));
}
fclose(luồng);
}
Đây là kết quả của hai bài kiểm tra của tôi:
voidArray: Tốt
voidArray: buổi sáng
voidArray: mọi người
phần tử mảng 0: Gmeveryone
phần tử mảng 1: meveryone
phần tử mảng 2: mọi người
Một lần nữa, có lẽ tôi đang thiếu một cái gì đó tầm thường. Điều tôi muốn làm là có một varray bao gồm các con trỏ void, mỗi con trỏ trỏ tới một đối tượng được đọc từ một tệp bên ngoài (ví dụ này là một chuỗi). Tôi biết mình đang làm sai điều gì đó với "varray+i", nhưng tôi không biết mình thực sự phải làm gì.
Tôi là một lập trình viên xuất sắc, rất giỏi!