2017-01-24 4 views
1

Код, над которым я работаю, нуждается в векторе удвоений в качестве ввода, и я пытался сделать его переменным размером, используя this small library Я нашел на git. Первая итерация с использованием строк вместо двойников является:память перезаписывается при чтении строк в c

printf("Write vector components (type 'stop' to stop): \n"); 
int stop = 0; 
while (!stop) 
{ 
    fgets(c, sizeof(c), stdin); 
    if (strcmp("stop\n",c)!=0) 
    { 
     vector_add(&v, c); 
    } else { 
     stop = 1; 
    } 
} 

Однако, когда я печатаю результат (например, с 3 входами и «стоп») Я получаю

the vector is: stop stop stop

Я пытался пишите первый компонент каждый раз, когда я ввожу новый, и результат состоит в том, что последний перезаписывает первый (и по расширению, учитывая конечный результат, каждый компонент).

Однако этого не происходит, если я использую vector_add вручную. Например, я попытался комбинируя пример из мерзавца и моего собственного кода и полного вывода является:

emil hannes lydia olle erik stop stop stop stop

Так он переписывает только при чтении. Я даже не могу понять, что происходит. За два года я не написал C, и я начинаю все заново.

Полный код (не включая векторной библиотеки):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "vector.c" 

void main(int argc, char* argv[]) { 
    char  c[20]; 
    vector  v; vector_init(&v); 


    printf("Write vector components (type 'stop' to stop):\n"); 
    int stop = 0; 
    while (!stop) 
    { 
     fgets(c, sizeof(c), stdin); 
     if (strcmp("stop\n",c)!=0) 
     { 
      vector_add(&v, c); 
      // printf("%s\n", (char*)vector_get(&v, 0)); 
     } else { 
      stop = 1; 
     } 
    } 


    printf("The vector is:\n"); 
    for (int i = 0; i < vector_count(&v); i++) { 
     printf("%s\n", (char*)vector_get(&v, i)); 
    } 

} /* main */ 
+1

Пытались ли вы к шагу через код построчно с помощью отладчика? –

ответ

2

vector_add не копирует данные, так что ваша строка еще сохраняется в переменной c. Когда вы читаете новую строку, она перезаписывает старую.

Если ваша строка библиотека содержит strdup, вы можете попробовать это:

vector_add(&v, strdup(c)); 
Смежные вопросы