1

ファイルから行を読み取り、文字ポインター配列を使用してそれらを保存したい次のコードがあります。ファイル読み取りループ内で1つのバッファーを使用しているため、文字配列内のすべてのポインターは、ファイルから読み取られた最後の行を指すことになります。最後の行は、ループが終了したときにバッファーに現在保持されている行です。文字配列内の各ポインターが読み取られた順序で異なる 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

そして、print ステートメントの出力:

client1 = xyz
client2 = xyz
client3 = xyz
4

2 に答える 2

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()そして最後に忘れないでください

于 2013-10-21T06:08:06.887 に答える
1

start_client配列内のすべてのエントリに同じポインタを割り当てます。配列testcharは異なる内容を取得しますが、それへのポインターは常に同じです。start_clientの配列の配列をchar作成し、代わりに文字列をコピーしたい場合があります。

お気に入り

char start_client[10][256];

strcpy(start_client[num_clients_to_start++], token1);
于 2013-10-21T06:04:44.987 に答える