从文件读取数据时无法为字符串分配值

时间:2019-01-18 09:26:12

标签: c string pointers

我有一个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,该值已正确分配。

2 个答案:

答案 0 :(得分:2)

timeZone = value;

这里您不是要复制内容,而是要使timeZone指向value。因此,timeZone将指向存储在value中的最新内容。

您可以做的是复制内容,而不是分配指针。

使用strdup

   timeZone = strdup(value);

   timeZone = malloc(strlen(value)+1);
   strcpy(timeZone, value);

答案 1 :(得分:1)

您应该声明一个静态缓冲区并与它们一起使用strcpy,或者使用strdup(并且不要忘记,在不需要它之后释放它们,而不是直接分配指针) )