C 从文件读取数据时无法为字符串赋值
我有一个config.txt文件,其中存储了生成一些记录所需的配置,我希望通过C代码读取配置值,并将参数值分配给一些变量。对于整数和浮点,变量分配正确,但是对于字符串类型,每次循环运行时,所有字符串变量都会更新,而不是更新一个特定的变量 配置的内容。C 从文件读取数据时无法为字符串赋值,c,string,pointers,C,String,Pointers,我有一个config.txt文件,其中存储了生成一些记录所需的配置,我希望通过C代码读取配置值,并将参数值分配给一些变量。对于整数和浮点,变量分配正确,但是对于字符串类型,每次循环运行时,所有字符串变量都会更新,而不是更新一个特定的变量 配置的内容。 时限=2 ING_IP=45.45.45.45 时区=GMT+05:30-印度 const char* timeZone = "GMT+09:00-Tokyo"; const char* ingIp = "null"; i
时限=2
ING_IP=45.45.45.45
时区=GMT+05:30-印度
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;
}
}
我得到的结果是,每次迭代的时区值都会被最新的ingIp值覆盖。我想分配ingIp=“45.45.45.45”和timeZone=“GMT+05:30-India”。对于timeLimit,值被正确分配
timeZone = value;
这里不是复制内容,而是使时区
指向值
。因此,时区
将指向存储在值
中的最新内容
您可以做的是复制内容,而不是指针分配
使用strdup
timeZone = strdup(value);
或
与直接指针分配不同,您应该声明一个静态缓冲区并对其使用strcpy,或者使用strdup(并且不要忘记在不需要时释放内存)timeZone=value代码>不从输入字符串中分配(复制)标记,只分配(复制)其指针。因此,当您读取另一个字符串时,数据被过度写入。您可能需要类似于strdup
的东西。我认为主要问题不是value
是循环的局部,而是value
是strtok
的结果,可能指向传递给strtok
的行中的某个地方。在每个循环周期中,line
的内容被getline
覆盖。在任何情况下,使用strdup
都会有所帮助。在我的情况下,strdup
按预期工作,strcpy
没有工作,因为它无法将时区从常量字符*转换为字符*strdup
是我一直在寻找的。由strdup
分配的内存不应在每次迭代时释放,而应仅在不再需要timeZone
和ingIp
时释放。
timeZone = malloc(strlen(value)+1);
strcpy(timeZone, value);