【问题标题】:Using a character pointer array to store multiple char arrays使用字符指针数组存储多个字符数组
【发布时间】:2013-10-21 06:00:06
【问题描述】:

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

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

【问题讨论】:

    标签: c pointers file-io strtok


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您将相同的指针分配给start_client 数组中的所有条目。数组testchar 将获得不同的内容,但指向它的指针将始终相同。您可能希望将start_client 设为char 的数组,然后复制该字符串。

      喜欢

      char start_client[10][256];
      

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

      【讨论】:

      • 对不起,我想我一定是在复制我的代码时错过了对 token1 的分配。已进行编辑
      • 是的,就是这样,指向testchar 的指针是相同的,因此最后所有打印语句都打印相同的内容。这就是我想知道的,如何避免这种情况?
      • @ZahaibAkhtar 是的。要么使用,要么使用strdup(但是当你完成它们时,你必须记住free)。
      • 对,所以在您上面的解决方案中,start_client[0] 将成为第一个数组,start_client[1] 将成为第二个数组,依此类推?
      • 谢谢,这增加了我的知识。如果我应该接受您的回答或@AlterMann,我现在有点困惑。两者都涵盖了相同的解决方案。
      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2018-08-15
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多