2010-12-02 2 views
0

Я работаю над программой на языке C, которая генерирует дважды связанный список «записей».Можете ли вы создать 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] имя вместо char[] имени?

Под «действительным», я имею в виду - я пытаюсь ограничить поле «имя» ровно 19 символами (+ нулевой терминатор). Должен ли я беспокоиться о длине в другом месте и сделать struct accept char массивами любой длины?

+0

Разница между этими двумя вариантами чрезвычайно нетривиальна. – Falmarri 2010-12-02 22:19:12

ответ

2

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

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; 

Хочу отметить, что в US, аббревиатуры состояний - 2 символа, поэтому вам, вероятно, нужно будет использовать char state[3], чтобы разрешить завершающий нуль.

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

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

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

+0

Спасибо. Вы тоже правы в государственных аббревиатурах. – 2010-12-02 22:47:21

0

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

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

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

Смежные вопросы