char * в структуре, переданной функции.Как получить доступ к этим данным? - PullRequest
0 голосов
/ 14 ноября 2018
typedef struct school_ {
    char *name;
    char *state;
} School;

Выше приведен структурный формат, который мне необходимо использовать для хранения данных из файла в формате

имя, состояние

имя2, состояние2

НижеМне дали объявление массива указателей, и во второй строке указывается, как вызывается функция.

School *TOP100[school_size];

input_schools(school_info,TOP100,school_size);

В моей функции мне нужно сохранить динамическую строку в качестве имени для каждой из 100 школ.

Я написал следующее, однако получил ошибку сегмента.Как я могу изменить свою функцию без изменения кода выше ?

void input_schools(FILE *IN, School **Sch, int k) {
    printf("in input_schools() ... \n\n\n");

    int i, j = 0;
    char ch;

    for (i = 0; i < k; i++) {
        fscanf(IN, "%c", &ch);
        Sch[i]->name = (char *) malloc(sizeof (char));
        j = 0;
        Sch[i]->name[j] = ch;

        while (ch != ',') {
            fscanf(IN, "%c", &ch);
            j++;
            Sch[i]->name = (char *) realloc(Sch[i]->name, sizeof(char) * (j + 1));
            Sch[i]->name[j] = ch;
        }
        Sch[i]->name[j - 1] = '\0';
    }

    return;
}

Пока этот код компилируется, он возвращает ошибку сегмента.

1 Ответ

0 голосов
/ 14 ноября 2018

Я думаю, что проще использовать библиотеку C в ваших интересах. У меня нет вашего входного файла, но это должно сработать или, по крайней мере, приблизить вас:

void input_schools(FILE *IN, School **Sch, int school_size)
{
  printf("in input_schools() ... \n\n\n");

  char *name;
  char *state;
  char *line;
  size_t line_len;

  for(int i=0; i<school_size; ++i) {
    line = NULL;
    line_len=0;

    // get line: line will contain a newly-allocated string
    // that holds a single line from the file
    if(-1 == getline(&line, &line_len, IN)) {
      // end of file reached
      break;
    }

    // make a new school
    Sch[i] = (School*)malloc(sizeof(School));

    // allocate storage for the name and state
    name = malloc(line_len); // we know that line_len is >= the size of the name
    state = malloc(line_len); // we know that line_len is >= the size of the state

    // everything before the = is the name, everything after is the state
    sscanf(line, "%[^=]s = %[^=]s", name, state);

    // free the memory getline() allocated
    free(line);

    Sch[i]->name = name;
    Sch[i]->state = state;
  } // end for all possible schools
} // end input_schools
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...