为什么我不更改变量时会更改其值? C

时间:2019-02-19 16:26:06

标签: c variables

我必须阅读文件上的一些配置才能完成大学的项目。 在我的读取函数中,我使用一个结构来存储配置,但是,我不知道为什么,其中一个变量在读取下一个参数时会更改其值。

struct client_config{
    char name[20]; //en teoria son 6 + '\0'
    char MAC[12];
    char server[20];
    int UDPport;
};

void read_software_config_file(struct client_config *config){

  FILE *conf;   
  conf = fopen(software_config_file, "r");   
  if(conf == NULL){
    fprintf(stderr, "Error obrir arxiu");
    exit(-1);   
  }
  char word[1024];   
  int i=0;

  fscanf(conf, "%s", word);   
  fscanf(conf, "%s", word);                /* No es la millor manera de fer-ho... pero ja que suposem que el fitxer es correcte*/   strcpy(config->name, word);                  /* Ens saltem les comprovacions */

  fscanf(conf, "%s", word);   
  fscanf(conf, "%s", word); 
  strcpy(config->MAC, word);   
  printf("%s this is config->mac after first read \n", config->MAC);

  fscanf(conf, "%s", word);   
  fscanf(conf, "%s", word);   
  strcpy(config->server, word);   
  printf("%s this is config->mac after next read \n", config->MAC);

  fscanf(conf, "%s", word);   
  fscanf(conf, "%s", word);   
  config->UDPport = atoi(word);   
  fclose(conf);

}

输出:

89F107457A36这是config-> mac,第一次读取后正确(这是正确的)

89F107457A36localhost,这是config-> mac,下次读取后不正确(这是不正确的)

我正在读取的文件是这样的:

Nom SW-01
MAC 89F107457A36
Server localhost
Server-port 2019

4 个答案:

答案 0 :(得分:2)

'\0'字段中没有空格来终止MAC

第一次复制到MAC字段时,printf'\0'字段中找到终止的server。复制到server后,server中的字符紧随MAC中的字符之后,而在两者之间没有终止'\0'

您至少需要

struct client_config{
    char name[20]; //en teoria son 6 + '\0'
    char MAC[13]; // 12 characters + '\0'
    char server[20];
    int UDPport;
};

您还应该检查strcpy复制的内容不多于结构字段的可用内存。也许使用strncpy代替strcpy,但是要确保结果以'\0'终止。 (请阅读strncpy的文档。)

答案 1 :(得分:2)

问题是MAC字段中没有空格可容纳结尾的\0字符。 C中的所有字符串都必须比实际数据长一个字符。

为了使读数更安全,我建议对fscanf使用最大长度。像这样:

fscanf(conf, "%12s", word); 

或更妙的是,使用fgets。可以很容易地使用变量或常量来获得最大长度。

fgets(word, MAXLENGTH, conf);

答案 2 :(得分:1)

您的MAC字段似乎正好包含12个字符,而尾随的0个字符没有位置,因此在打印过程中将直接附加以下服务器。

答案 3 :(得分:0)

  • 检查 struct client_config 成员的大小,不要忘记考虑字符串空终止符“ \ 0”。

  • 别忘了用零之前初始化 struct client_config 结构。