我是C的新手,在使用和理解指針方面 - 特別是void指針時,我仍然很弱。我試圖編寫一個從文件加載數據的函數,並將這些數據存儲在一個void指針數組中,這樣數組的每個元素(在本例中)都具有該文件行中的字符串。我懷疑是有一些問題的代碼:C:使用void指針數組工作
- 我不知道如果我正確使用* voidArray []作爲函數的參數之一。
- 我不確定strcpy()是否是將行緩衝區內容複製到相關數組元素的好方法。
- 我不知道strcpy()的目的地(即void指針數組中的相關元素)的正確語法。
也可能有其他錯誤,但這些是我感到非常不確定的三個問題。
這裏是我的功能:
void *readData(void *voidArray[], const char *filename, int lines) {
FILE *stream = fopen(filename, "r");
if (stream == NULL) {
perror("Error loading file");
return 1;
}
char lineBuffer[BUFFER_SIZE];
int i = 0;
while(!feof(stream)) {
while(fgets(lineBuffer, sizeof(lineBuffer), stream)) {
// *voidArray[i] = malloc(strlen(lineBuffer) + 1); // probably not what I want
strcpy(*voidArray[i], lineBuffer);
i++;
}
}
fclose(stream);
}
...這是)的主要開始(其中,(再次)我不知道正確的語法是什麼聲明數組(和初始化?) :
int main(void)
{
int lines = 20;
void *varray[lines];
// varray = malloc(sizeof(char *) * lines); // probably not what I want
readData(varray[lines], FILENAME, lines); // FILENAME declared earlier
一些建議代碼修復將非常感謝(尤其是如果我完全缺少一個更合適的方法船),但我覺得我需要更多的是爲什麼一個很好的解釋這些建議是正確的。如果我能把這個問題包括在內,我認爲 - 最糟糕的是 - 我會很清楚自己仍然需要教導自己的重點:指針。提前感謝您的幫助或評論,並請耐心等待。
編輯:約阿希姆Pileborg的答案已經幫助,但我仍然失去了一些基本(可能很明顯)。這裏是我的修訂功能:
void *loadData(void *voidArray, const char *filename, int lines) {
FILE *stream = fopen(filename, "r");
if (stream == NULL) {
perror("Error loading file");
}
char lineBuffer[BUFFER_SIZE];
int i = 0;
while(fgets(lineBuffer, sizeof(lineBuffer), stream)) {
strcpy((voidArray+i), lineBuffer);
printf("voidArray: %s\n", (char *)(voidArray+i));
i++;
}
for (i = 0; i < lines; i++) {
printf("array element %d: %s\n", i, (char *)(voidArray+i));
}
fclose(stream);
}
這裏是從我的兩個測試的結果:
voidArray: Good
voidArray: morning
voidArray: everyone
array element 0: Gmeveryone
array element 1: meveryone
array element 2: everyone
同樣,我可能失去了一些東西微不足道。我想要做的是varray由void指針組成,每個指針指向一個從外部文件讀取的對象(對於這個例子來說,一個字符串)。我對「varray + i」有什麼不對,但我不知道我應該怎麼做。
你不需要外循環('while(!feof(...))'循環)。實際上,如果在文件結束之前讀取文件時出現錯誤,它可能會導致無限循環。 –
如果你存儲字符,爲什麼不使用char數組,char指針?你不需要這個 –
啊,我認爲你對外環的冗餘是正確的。謝謝!讀取我創建的用於測試的任何文件時沒有錯誤,並且將文件行讀入緩衝區是該函數的少數幾個方面之一,我確信它正在按預期工作。 – jda