Можете ли вы сделать структуру c из массива определенной длины? - PullRequest
0 голосов
/ 03 декабря 2010

Я работаю над программой на C, которая генерирует двусвязный список «записей».

Я создал прототип структуры следующим образом:

struct custRec(char[20] name, char[50] address, char[20] city,
         char[2] stateAbbreviation, int zipCode, float balance);
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec);

В частности, длямоя структура custRec, допустимо ли использовать char[20] name вместо char[] name?

Под "valid" я имею в виду - я пытаюсь ограничить поле "name" ровно 19 символами(+ нулевой терминатор).Стоит ли беспокоиться о длине в другом месте и заставить структуру принимать массивы символов любой длины?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Этот синтаксис неправильный (сначала я неправильно прочитал вопрос, потому что они выглядят как объявления функций, а не определения структур):

struct custRec(char[20] name, char[50] address, char[20] city,
         char[2] stateAbbreviation, int zipCode, float balance);
struct linkedRec(custRec storedRec, custRec* nextRec, custRec* prevRec);

Вы, вероятно, имели в виду:

typedef struct custRec
{
    char  name[20];
    char  address[50];
    char  city[20];
    char  stateAbbreviation[2];
    int   zipCode;
    float balance;
} custRec;  // Necessary because question is about C, not C++

typedef struct linkedRec
{
    custRec  storedRec;
    custRec *nextRec;
    custRec *prevRec;
} linkedRec;

Я отмечаю, что в США аббревиатуры штатов состоят из 2 символов, поэтому вам, вероятно, нужно использовать char state[3] для разрешения завершающего нуля.

Теперь это синтаксически допустимо. Когда вы копируете данные в поля custRec, вам нужно быть осторожным, чтобы убедиться, что копирование не выходит за границы. Компилятор не применяет длины.

Вам нужно будет проверить, поэтому внутри функции, что передаваемые вам строки не превышают ожидаемых вами пределов.

Если вы предпочитаете не накладывать ограничений на длины, все члены структуры строк можно преобразовать в char *, и вы можете динамически распределять память для строк произвольной длины. Но это, вероятно, не очень хорошая идея для аббревиатур штатов США; там вы хотите применить ограничение «2 символа плюс '\0'».

0 голосов
/ 03 декабря 2010

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

И да, вам нужно будет указать char[20] вместо char[], так как вам нужно зарезервировать место для данных.

Примечаниеоднако это накладывает произвольный верхний предел на эти поля и делает его более трудным в дальнейшем расширении.Подумайте о том, чтобы иметь регулярные char* поля и выделять строки в куче, чтобы вы могли обрабатывать строки любой длины.Это требует некоторой осторожности с управлением памятью (особенно очистка!).

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