2013-04-15 2 views
0

Имея проблемы со слегка более сложным разделом кода, я удалился на него, но все же ошибка остается. Не могли бы вы бросить беглый взгляд на это и указать на мои ошибки?Запись проблемы в массив строк

//before this, nbnoeud is defined and graphe is a stream that reads from a .txt file 

double* xtab = (double *) calloc(nbnoeud, sizeof(double)); 
double* ytab = (double *) calloc(nbnoeud, sizeof(double)); 
char** nomtab = (char **) calloc(nbnoeud, 100*sizeof(char)); 

double x, y; char nom[100]; int numero=0, scancheck; 

int a; 
for(a=0; a<nbnoeud; a++){ 
    scancheck = fscanf(graphe, "%d %lf %lf %[^\n]", &numero, &x, &y, nom); 
    if(scancheck = 4) printf("Read item %d; \t Scancheck: %d; \t %s - (%lf, %lf). \n", numero, scancheck, nom, x, y); 
    xtab[a] = x; 
    ytab[a] = y; 
    nomtab[a] = nom; I imagine it's something to do with compatibility of this but to my eyes it all checks out 
    /*int b; //this section just illustrates that only the previously accessed elements are being overwritten. See code2.png 
    for(b=0; b<=nbnoeud; b++){ 
     printf("%s \n", nomtab[b]); 
    }*/ 
} 

for(a=0; a<nbnoeud; a++){ 
    printf("Read item %d; \t \t \t %s - (%lf, %lf). \n", a, nomtab[a], xtab[a], ytab[a]); 
} 

exit(1); 

Проблема возникает тогда, когда я пришел к печати через nomtab[0][7] (nbnoeud = 8, в данном случае), так как все значения (nomtab[0], nomtab[1] и т.д.) равны конечное значение, которое было написано. Необычно, проверив, только перезаписанные элементы nomtab перезаписаны. Например, после первого цикла nomtab[0]= Aaa, а остальные равны null; после второго контура nomtab[0] & nomtab[1] = Baa, а остальные равны null (см. второе изображение). Я предполагаю, что для этого есть идиотично простое решение, но это делает незнание еще более невыносимым.

Я также пробовал использовать strcpy, и ему это не понравилось.

Любые идеи?

Выход:

Output:

Вывод с проверкой содержимого массива после каждого цикла

Output with check of array contents after each loop

+0

strcpy должен работать. перед использованием strcpy вы выделили память для nomtab [a]? – 999k

ответ

2

Проблема заключается в вашей линии

nomtab[a] = nom; 

Это устанавливает указатель в nomtab [a], чтобы указать на местный массив nom. Но с каждой итерацией цикла вы переписываете nom при чтении файла Input с fscanf. Если вы хотите сохранить все строки, вы должны сделать копию nom и сохранить это. Вы можете использовать strdup(nom), чтобы сделать копию ном.

Кстати, вы вызываете fscanf, не ограничивая число символов для записи в nom. Это плохая идея. Если в файле слишком длинная строка, у вас будет переполнение буфера в nom, переписывание вашего стека.

Edit: Эта строка выглядит suspicous:

char** nomtab = (char **) calloc(nbnoeud, 100*sizeof(char)); 

Я предполагаю, что вы хотите, это массив с nbnoeud строк длиной 100 символов. Вы должны изменить что либо

char* nomtab = (char *) calloc(nbnoeud, 100*sizeof(char)); 
strcpy(nomtab[100*a], nom); 

или

char** nomtab = (char **) calloc(nbnoeud, sizeof(char*)); 
nomtab[a] = strdup(nom); 

В первом случае nomtab большой буфер, содержащий все строки (символов), во втором случае nomtab представляет собой массив указателей на строки, каждый из которых выделяется другим способом. Во втором случае вам нужно позаботиться о выделенных строковых буферах free().

Смежные вопросы