Почему я не могу использовать strcpy?

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

передача аргумента 1 из strcpy делает указатель из целого числа без приведения

ожидается 'char *restrict', но аргумент имеет тип 'char'.

Вот мой код. gb — это указатель, указывающий на структуру. Если я недостаточно разъяснил что-либо, пожалуйста, спросите.

int add_assignment(Gradebook *gb, const char assgn[MAX_NUMBER_OF_ASSIGNMENTS]) {
  int i, j;

  for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) {
    for(j=0; j < (MAX_NAME_LEN+1); j++) {
      strcpy(gb->assignment_names[i][j], assgn);
    }
  }

  return 1;
}

Вот структура журнала оценок:

typedef struct gradebook {
  int number_of_students;
  Students students[MAX_NUMBER_OF_STUDENTS];
  int number_of_assignments;
  char assignment_names[MAX_NUMBER_OF_ASSIGNMENTS][MAX_NAME_LEN + 1];
  int scores[MAX_NUMBER_OF_STUDENTS][MAX_NUMBER_OF_ASSIGNMENTS];
} Gradebook;

person RubberLotus    schedule 11.12.2015    source источник
comment
Я предполагаю, что ваши имена_назначений представляют собой двумерный целочисленный массив? Используйте memcpy для не строковых типов. Опубликовать структуру было бы неплохо.   -  person Hatted Rooster    schedule 11.12.2015
comment
strcpy ожидает копирования символов в буфер, куда вы передаете адрес начала буфера. Судя по сообщению об ошибке, кажется, что gb->assignment_names[i][j] не является адресом чего бы то ни было.   -  person M.M    schedule 11.12.2015
comment
Кажется странным, что вы использовали бы MAX_NUMBER_OF_ASSIGNMENTS для длины имени назначения, а также для максимального количества назначений.   -  person M.M    schedule 11.12.2015
comment
Re: MAX_NUMBER_OF_ASSIGNMENTS: это просто заполнитель. Не беспокойтесь об этом.   -  person RubberLotus    schedule 11.12.2015
comment
Пожалуйста, покажите объявление структуры Gradebook.   -  person Barmar    schedule 11.12.2015
comment
Итак, gb-›assignment_names[i][j] не адрес? Тогда что это? Будет ли это просто значение в именах_назначений в строке i, столбце j?   -  person RubberLotus    schedule 11.12.2015
comment
@RubberLotus - Мы не знаем. Вы еще не показали объявление структуры.   -  person owacoder    schedule 11.12.2015
comment
Вставьте код структуры Gradebook. Это подойдет?   -  person RubberLotus    schedule 11.12.2015


Ответы (2)


Проблема в использовании двух циклов:

for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) {
  for(j=0; j < (MAX_NAME_LEN+1); j++) {
   strcpy(gb->assignment_names[i][j], assgn);
  }
}

Внутренний цикл пытается скопировать строку (assgn) в один char. Вы, вероятно, имели в виду

for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) {
  strcpy(gb->assignment_names[i], assgn);
}

вместо этого, но это может быть и не то, что вам нужно, когда одно назначение перезаписывает весь список назначений. Трудно сказать, какую логику вы ищете.

person owacoder    schedule 11.12.2015
comment
Хе. Должен признаться, что я учусь этому по мере продвижения - у меня есть общее представление о том, чего я хочу, но мое понимание того, как это реализовать, еще слабее, чем я думал, и ваше уважение ко мне, вероятно, падает с каждым словом. . - person RubberLotus; 11.12.2015
comment
А если серьезно, спасибо за помощь. Сейчас попробую все ваши советы. - person RubberLotus; 11.12.2015

assignment_names[i][j] — это одиночный символ, а не строка. assignment_names[i] - это массив символов, поэтому вы должны скопировать его. Вам не нужен внутренний цикл.

int add_assignment(Gradebook *gb, const char assgn[]) {
    int i;

    for(i=0; i < MAX_NUMBER_OF_ASSIGNMENTS; i++) {
       strcpy(gb->assignment_names[i], assgn);
    }

    return 1;
}
person Barmar    schedule 11.12.2015
comment
Кажется неясным, почему функция с именем add_assignment меняет имя каждого отдельного присваивания. - person M.M; 11.12.2015