我有一个config.txt文件,在其中存储生成一些记录所需的配置,我想通过C代码读取配置值并将参数值分配给某些变量。对于整数和浮点数,变量的分配是正确的,但是对于字符串类型,每次循环运行时,所有的字符串变量都会被更新,而不是一个特定的变量。
配置内容。
TIME_LIMIT=2
ING_IP=45.45.45.45
TIMEZONE=GMT+05:30-India
const char* timeZone = "GMT+09:00-Tokyo";
const char* ingIp = "null";
int timeLimit = 0;
char *configFileName = argv[++i];
FILE *configFileHandle = fopen(configFileName, "r");
char * line = NULL;
// if (( fgets(line, 500, configFileHandle)) != NULL){
// puts(line);
// }
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, configFileHandle)) != -1) {
printf("Line: %s\n", line);
char *parameter = strtok(line, "=");
char *value = strtok(NULL, "=");
char *ptr;
if( (ptr = strchr(value, '\n')) != NULL)
*ptr = '\0';
if( (ptr = strchr(value, '\r')) != NULL)
*ptr = '\0';
if ( strcmp(parameter, "TIME_LIMIT") == 0 ) {
timeLimit = atoi(value);
}else if ( strcmp(parameter, "TIMEZONE") == 0 ) {
timeZone = value;
}else if ( strcmp(parameter, "ING_IP") == 0 ) {
ingIp = value;
}
}
我得到的结果是每次迭代timeZone值都被ingIp的最新值覆盖。我想分配ingIp =“ 45.45.45.45”和timeZone =“ GMT + 05:30-India”。对于timeLimit,该值已正确分配。
答案 0 :(得分:2)
timeZone = value;
这里您不是要复制内容,而是要使timeZone
指向value
。因此,timeZone
将指向存储在value
中的最新内容。
您可以做的是复制内容,而不是分配指针。
使用strdup
。
timeZone = strdup(value);
或
timeZone = malloc(strlen(value)+1);
strcpy(timeZone, value);
答案 1 :(得分:1)
您应该声明一个静态缓冲区并与它们一起使用strcpy
,或者使用strdup
(并且不要忘记,在不需要它之后释放它们,而不是直接分配指针) )