2013-04-15 83 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); 

產生的問題是,當我穿過[7]打印nomtab[0]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。但是對於每次循環迭代,當使用fscanf讀取文件Input時,您將覆蓋nom。如果你想存儲所有的字符串,你應該製作一個名義副本並存儲它。您可以使用strdup(nom)製作nom的副本。

順便說一句,你正在調用fscanf而不限制要寫入nom的字符數。這是一個壞主意。如果文件中有一行太長,那麼你將在nom中產生緩衝區溢出,覆蓋你的堆棧。

編輯: 這行看起來suspicous:

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

我猜,你想要的是用100個字符長度的字符串nbnoeud數組。你應該改變其要麼

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()