使用字符指针数组存储多个char数组

时间:2013-10-21 06:00:06

标签: c pointers file-io strtok

我有以下代码,我正在从文件中读取行并希望使用字符指针数组保存它们。由于我在文件读取循环中使用了一个缓冲区,因此字符数组中的所有指针最终都指向从文件读取的最后一行,因为最后一行是当循环终止时当前保存在缓冲区中的那一行。我如何存储它们,使得字符数组中的每个指针按照它们被读取的顺序指向不同的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

2 个答案:

答案 0 :(得分:3)

请注意,start_client[0][1][2]都是指向最后一个字符串的指针(由fgets引导)

使用strdup分配它们:

start_client[num_clients_to_start] = strdup(testchar);

由于strdup可以是外部标识符,因此请使用原型

#include <string.h>

char *strdup(const char *s); 

最后不要忘记free()

答案 1 :(得分:1)

您为start_client数组中的所有条目指定相同的指针。数组testchar将获得不同的内容,但指向它的指针将始终相同。您可能希望start_client成为char数组的数组,而是复制字符串。

char start_client[10][256];

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