cuốn sách gpt4 ai đã làm

C: Sử dụng mảng con trỏ null

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 04:44:19 35 4
mua khóa gpt4 Nike

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ã:

  1. 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.
  2. 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.
  3. 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ì.

câu trả lời hay nhất

Nhìn thoáng qua tôi thấy bốn vấn đề (ngoài vấn đề tôi đã đề cập trong nhận xét của mình):

  • Đầu tiên là bạn đã nhận xét việc phân bổ, vì vậy nếu con trỏ không được phân bổ khi hàm được gọi thì bạn đang ghi vào một vị trí dường như ngẫu nhiên trong bộ nhớ.

  • Điều thứ hai là khi bạn gọi strcpy khi sử dụng toán tử quy chiếu. Ví dụ, nếu bạn có một ký tự mảng con trỏ, đây sẽ là một ký tự thay vì con trỏ. Ngoài ra, bạn thực sự không thể dereference void 指针。

  • Vấn đề thứ ba là bạn không bao giờ kiểm tra số lượng mục trong mảng, bạn cứ lặp đi lặp lại việc đọc và sao chép vào mảng mà không xem xét kích thước của nó.

  • Vấn đề thứ tư là cách bạn gọi hàm này, thực tế bạn không truyền một mảng con trỏ mà truyền chỉ mục dòng Việc truyền con trỏ sẽ vượt quá giới hạn của mảng.


Là một lưu ý phụ không liên quan: hãy nhớ nếu fgetĐọc ký tự dòng mới, ký tự này sẽ nằm trong bộ đệm.

Về C: Sử dụng mảng con trỏ null, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/22747461/

35 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress