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