C - 从 .INI 文件中读取并将值传递给 vars

C - Read from .INI file and pass values to vars

我正在为学校做一个项目,我需要读取 .INI 文件以启动我的游戏变量。问题是,我似乎无法理解 strtok 的工作原理,此时我真的很困惑。

我知道我返回的是一个空结构,因为我不知道如何将特定值放入变量中!

这是我的 read_from_config.h

#ifndef READ_FROM_CONFIG_H
#define READ_FROM_CONFIG_H
#define MAXSTR 500

typedef struct {
  unsigned int xdim;
  unsigned int ydim;
  unsigned int nzombies;
  unsigned int nhumans;
  unsigned int nzplayers;
  unsigned int nhplayers;
  unsigned int turns;
} CONFIG;

CONFIG read_config(char *argv[]);

#endif

这是我的 read_from_config.c

#include "read_from_config.h"
#include "example.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

CONFIG read_config(char *argv[]) {
  char str[MAXSTR];
  FILE *fp = NULL;
  char *filename = argv[1];
  char *token;

  fp = fopen(filename, "r");
  if (fp == NULL) {
    fprintf(stderr, "Não foi possível abrir ficheiro de configuração.");
    fprintf(stderr, "\nModo de uso: ./program_name config.ini");
  }

  while (fgets(str, MAXSTR, fp) != NULL) {
      for (int i = 0; i != '[=11=]'; i++) {
        char *equal = strpbrk (str, "=");
        if (equal) {
          token = strtok(str, "=");
        }
      }
  }
  printf("%d", token[0]);
  CONFIG config;
  return config;
}

CONFIG.INI

; Dimension of the grid
xdim=20
ydim=20
; Inicial number of zombies and humans
nzombies=20
nhumans=20
; Number of zombies and humans controlled by players
nzplayers=0
nhplayers=1
; Number of maximum turns
maxturns=1000

函数 strtok 仅在第一次调用时获取字符串。 全部 后续调用必须通过 NULL

man strtok

#include <string.h>
char *strtok(char *str, const char *delim);

DESCRIPTION

The strtok() function breaks a string into a sequence of zero or more nonempty tokens. On the first call to strtok(), the string to be parsed should be specified in str. In each subsequent call that should parse the same string, str must be NULL.

示例:

char line[] = "a,b,c,d,e,f\n"; // to simulate an fgets line
char *token = strtok(line, ",\n");  // you can add \n to the separator
                                    // to get rid of the \n at the end

puts(token); // prints a
while(token = strtok(NULL, ",\n"))
    puts(token);  // prints b then c etc..

记住 strtok 修改源,这将失败:

strtok("a,b,c", ",");

因为字符串文字是不可修改的。在这种情况下,您必须复制一份 到 char[] 或动态分配的 char*.

如果您需要在解析后完整地保留源代码,那么您绝对 需要复印一份。

在你的代码中你做了:

printf("%d", token[0]);

这没有错,但可能不是您想做的。这条线不 打印第一个字符,它打印第一个字符的ascii值。

这个

printf("%c", token[0]);

将打印第一个字符。

你也在做

CONFIG read_config(char *argv[]) {
    ...
    CONFIG config;
    return config;
}

您正在返回一个未初始化的 CONFIG 对象,您忽略了解析 并且您的配置对象中没有设置任何内容。

你的解析也有点奇怪。

for (int i = 0; i != '[=16=]'; i++)

循环立即退出,因为0 == '[=29=]'!我不明白你是什么 试着用它来做。

我会首先创建一个辅助函数来填充配置的值,请​​参阅 set_config_val。然后你可以这样解析它:

CONFIG read_config(char *argv[]) {
    ...

    const char *delim = "=\n";
    CONFIG config;

    while (fgets(str, MAXSTR, fp) != NULL) {

        if(strchr(str, '='))
        {
            char varname[100];
            int value;

            token = strtok(line, delim);
            strcpy(varname, token);

            token = strtok(NULL, delim);
            value = atoi(token);

            set_config_val(&config, varname, value); 
        } else {
            fprintf(stderr, "Skipping line, no = found");
        }

    }

    fclose(fp);
    return config;
}


void set_config_val(CONFIG *config, const char *key, int val)
{
    if(config == NULL)
        return;

    if(strcmp(key, "xdim") == 0)
        config->xdim = val;
    else if(strcmp(key, "ydim") == 0)
        config->ydim = val;
    ...
}