真的在这里挣扎,无法弄清楚如何从数组中获取我的价值。
我首先声明这个数组,我想要保存一组数字。 IDK为什么大小为64,我只是感到沮丧并给它一个大小。
char *numberList1[64];
然后我使用我找到的一些代码读入文件。
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
char string[100];
int counter = 0;
printf("\n\nEnter name of File 1: ");
scanf("%s", string);
fp = fopen(string, "r");
if (fp == NULL) {
printf("invalid filename of %s",string);
exit(EXIT_FAILURE);
}
while ((read = getline(&line, &len, fp)) != -1) {
numberList1[counter] = line;
counter++;
}
现在,如果要在printf("%s",numberList1[counter]);
中说出while
之类的内容,我会收回所有数据。
然而,当我说下面的内容时,我只会打印出最后一个项目,但有时会有数字。 (vectorLength)。
int j;
//vectorLength is the user-entered # of lines/numbers in the file.
for (j = 0; j < vectorLength; j++) {
printf("Writing out: %s \n", numberList1[j] );
//write(pipe1[WRITE], currentNum, bitSize+1);
}
即。如果我有数字,1,2,3,4 我会得到:4 4 4 4
我做错了什么???我试图在C中找到理解指针和数组的指南,但我无法弄明白......
答案 0 :(得分:1)
我相信我找到了问题的根源。
在下面的代码中,您正在将每一行读入line
指向的位置的内存中。然后,将指针存储到内存中,并将其存储到数组中的每个索引中。问题是每次读一行时都会覆盖line
指向的位置的内存。结果,只有最后读取的值存储在该位置。由于数组中的每个索引都指向同一个位置,因此代码中最后一个循环的每次迭代都将显示相同的值。
char * line = NULL;
while ((read = getline(&line, &len, fp)) != -1) {
numberList1[counter] = line; // You are storing the pointer here, NOT the value
counter++;
}
相反,在循环的每次迭代中为数组分配内存(getline会自动执行此操作),并将 指针复制到数组中。
while ((read = getline(&line, &len, fp)) != -1) {
numberList1[counter] = line;
line = NULL;
counter++;
}
确保释放在此过程中分配的所有内存。
答案 1 :(得分:1)
您没有正确准备发送到getline()
的参数。根据文件:
如果在调用之前将* lineptr设置为NULL并且* n设置为0,则
getline()
将分配用于存储该行的缓冲区。即使getline()失败,也应该由用户程序释放此缓冲区。
你想要为每一行提供一个新的行缓冲区,并且至少你似乎希望getline()
为你做这个,所以,在每次成功读取之后,以及一旦保存返回的返回缓冲区指针在数组中getline()
,将行指针清回NULL并将length参数恢复为零:
char * line = NULL;
size_t len = 0;
while ((read = getline(&line, &len, fp)) != -1 && counter < 64)
{
numberList1[counter++] = line;
line = NULL; // <<==== ADDED
len = 0; // <<==== ADDED
}
free(line); // note: this is here because, though getline() failed, the
// documentation for the api mandates its presence.