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

我有一个config.txt文件,其中存储了生成一些记录所需的配置,我希望通过C代码读取配置值,并将参数值分配给一些变量。对于整数和浮点,变量分配正确,但是对于字符串类型,每次循环运行时,所有字符串变量都会更新,而不是更新一个特定的变量

配置的内容。

时限=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);