Почему моя переменная меняет свое значение, когда я не меняю ее?С - PullRequest
0 голосов
/ 19 февраля 2019

Мне нужно прочитать конфигурацию в файле, чтобы сделать проект из колледжа.В моей функции чтения я использую структуру для хранения конфигурации, но я не знаю, почему одна из переменных меняет свое значение при чтении следующего параметра.

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);

}

OUTPUT:

89F107457A36 это config-> mac после первого чтения (это правильно)

89F107457A36localhost это config-> mac после следующего чтения (это неправильно)

файл, который я читаюэто:

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

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019
  • Проверьте размер struct client_config членов, не забудьте учесть нулевой терминатор строки "\ 0".

  • Нене забудьте инициализировать struct client_config с нулями до.

0 голосов
/ 19 февраля 2019

У вас нет места для окончания '\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.)

0 голосов
/ 19 февраля 2019

Проблема в том, что в поле MAC нет места для конечного символа \0.Все строки в C должны быть на один символ длиннее фактических данных.

Чтобы сделать чтение более безопасным, я бы рекомендовал использовать максимальную длину для fscanf.Вот так:

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

Или, что еще лучше, используйте fgets.Это позволяет легко использовать переменную или константу для максимальной длины.

fgets(word, MAXLENGTH, conf);
0 голосов
/ 19 февраля 2019

Похоже, что в вашем поле MAC ровно 12 символов, и нет места для конечного 0 символов, поэтому следующий сервер напрямую добавляется во время печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...