2013-10-21 73 views
0

我有以下代碼,我正在讀取文件中的行並希望使用字符指針數組保存它們。由於我在文件讀取循環中使用了一個緩衝區,因此字符數組中的所有指針最終都指向從文件讀取的最後一行,因爲最後一行是循環終止時當前保存在緩衝區中的一行。我如何存儲它們,以便字符數組中的每個指針按照它們讀取的順序指向不同的char數組。使用字符指針數組來存儲多個char數組

int num_clients_to_start = 0; 
char *token1, *token2, *str; 
FILE* fp; 
char bufr[256]; 
char testchar[255] = {}; 
char *start_client[10]; 

while(fgets(bufr, 256, fp) != NULL){ 

    if(bufr[0] == '#'|| bufr[0] == '\n') 
    continue; 

    str = bufr; 

    token2 = ""; /* initializing an empty token 2 */ 
     for(str = bufr; ;str = NULL){ 
    token1 = strtok(str, " "); 
    if(strcmp(token2, "client_name") == 0){ 
     sprintf(testchar,"%s", token1); 
      start_client[num_clients_to_start] = testchar; 
     num_clients_to_start++; 
    }     

    token2 = token1; 

    if(str == NULL){ 
      break; 
    } 
    }//end of for loop 

}//end of while loop 

printf("client1 = %s client2 = %s client3 = %s",start_client[0],start_client[1],start_client[2]); 

我的輸入文件如下:

client_name abc 
client_name def 
client_name xyz 

和打印語句輸出:

client1 = xyz 
client2 = xyz 
client3 = xyz 

回答

1

您指定同一指針的所有條目的​​陣列英寸數組testchar將獲得不同的內容,但指向它的指針始終是相同的。您可能想要​​爲char的數組數組,然後複製該字符串。

char start_client[10][256]; 

而且

strcpy(start_client[num_clients_to_start++], token1); 
+0

對不起,我想我一定是錯過了分配,同時複製到TOKEN1我的代碼。編輯 –

+0

是的,這樣的話,「testchar」的指針是相同的,因此最後所有的打印語句都打印相同的東西。那就是我想知道的,如何避免這種情況? –

+0

@ZahaibAkhtar是的。要麼是使用'strdup'(但是當你完成這些指令時,你必須記得「釋放」指針)。 –

2

注意start_client[0][1][2]都指向最後一個字符串(由fgets readed)

使用strdup,以對其進行分配:

start_client[num_clients_to_start] = strdup(testchar); 

由於strdup可以了外部標識,使用原型

#include <string.h> 

char *strdup(const char *s); 

和結束時不要忘了free()