我刚开始用C编码 我已经实现了一个向我追加字符串时似乎正在工作的向量, 但是一旦我从文件中读取,我似乎一次又一次地得到最后一个字符串。 从我可以看到它似乎使用相同的地址,因此我一次又一次得到相同的行。
但我似乎无法找到问题的解决方案,希望你能提供帮助。
这是我的矢量结构:
void vector_init(Vector *vector){
vector -> size = 0;
vector -> capacity = 20;
vector -> data = malloc(sizeof(void *) * vector -> capacity);
}
并附加到vector:
void vector_push(Vector *vector, void *value){
vector_double_capacity(vector);
vector -> data[vector -> size ++] = value;
}
以下是我在主要功能中所做的事情:
int main(int argc, char *argv[]) {
Vector someVector;
vector_init(&someVector);
FILE *fp;
void *line = NULL;
size_t len = 0;
fp = fopen(argv[1], "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while (getline(&line, &len, fp) != -1){
vector_push(&someVector, line);
}
fclose(fp);
printf("\n");
vector_push(&someVector, "blah");
vector_push(&someVector, "test");
vector_push(&someVector, "some random txt");
vector_push(&someVector, "yollo");
vector_push(&someVector, "something");
for (int i = 0; i < someVector.size; i++)
printf("\nvalue is : %s", (char *) vector_get_element(&someVector, i));
return 0;
}
我的get_element函数:
void *vector_get_element(const Vector *vector, size_t index){
if (index >= vector -> size || index < 0){
printf ("Index %d out of bounds", (int) index);
}
return vector -> data[index];
}
这是我的输出:
value is : terminal
value is : terminal
value is : terminal
value is : terminal
value is : blah
value is : test
value is : some random txt
value is : yollo
value is : something
Process finished with exit code 0
答案 0 :(得分:0)
您需要复制添加到矢量中的数据。
void vector_push(Vector *vector, void *value, size_t bytes){
vector_double_capacity(vector);
void *copy = malloc(bytes);
memcpy(copy, value, bytes);
vector -> data[vector -> size ++] = copy;
}
你必须用
这样的东西来打电话vector_push(&someVector, line, 1 + strlen( line ) );
保留向量的明显目的,即保存指向任何类型数据的指针而不只是NUL
- 终止字符串。您可能还想在结构中添加size
字段,以便了解指向的数据量。
答案 1 :(得分:0)
我发现了另一个简单的方法。
while (getline(&line, &len, fp) != -1){
vector_push(&someVector, line);
}
line = NULL;
将行设置为NULL