Изменение значений массива, содержащего печать структуры - PullRequest
1 голос
/ 01 октября 2011

Я хотел бы получить доступ к полю имени из элементов массива и напечатать имя, но у меня возникли проблемы.

Я создал указатель 'L' в callInitialize и установил для него верхний тип структуры List, который я назвал 'studentList'.

int callInitialize () {

/*Initialize a List*/
List studentList;
List *L;
L = &studentList;
Initialize(L);

#ifdef DEBUG
    printf("L->count after function call Initialize = %d\n", L->count);
    printf("L->items[0].name after function call Initialize = %s\n", studentList.items[0].name);
#endif 

return 0;
}

Затем я вызвал Initialize и попытался установить значение для проверки, но это неверно.

void Initialize (List *L) {
char test = "I like you";
L->count = 0;
L->items[0].name = test;
}

Я не уверен, почему L-> items [0] .name = test; не подходит Я получаю сообщение о несовместимых типах, но имя - char, а test - char?

Кроме того, как только я изменю это значение, как я буду печатать это? Я думал, что% s будет правильным, так как тип имени поля - char. Print указан выше в callIntialize как оператор отладки.

Мои объявления структуры:

#define MAXNAMESIZE 20
typedef struct {
char name[MAXNAMESIZE];
int grade;   
} Student;

typedef Student Item;
#define MAXLISTSIZE 4
typedef struct {
Item items[MAXLISTSIZE];
int count;
} List;

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 01 октября 2011

Копирование строк в C не работает так. Строки - это просто массивы символов с нулевым символом в качестве последнего использованного элемента; поэтому для копирования строки необходимо скопировать отдельные символы из исходного массива в соответствующие элементы в целевом массиве. Для этого есть библиотечные функции, такие как strncpy().

Так что вам нужно изменить:

L->items[0].name = test;

.. что-то вроде:

strncpy(L->items[0].name,test,MAXNAMESIZE);
L->items[0].name[MAXNAMESIZE - 1] = '\0';

.. где вторая строка просто проверяет наличие нулевого символа в конце, если test длиннее MAXNAMESIZE.

Если бы name член Student был объявлен как char * и выделен с помощью malloc(), а не объявлен как массив char, назначение сработало бы, но, вероятно, не сделало бы то, что Вы хотели - он изменил бы name, чтобы указывать на ту же строку, что и test (не его копию), и просто отбросил бы исходное значение, вытекла из памяти malloc() ed.

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