Итак, мои вопросы:
Am I initializing the array elements members to be really null (e.g cFirstName[10]) ?
Is there a better way ?
How can I check that an array element member is empty ?
Заранее спасибо за ваши ответы!
То, что вы сделали при инициализации массива структуры, может быть улучшено.
Первая фигурная скобка говорит: «инициализируйте массив с моим содержимым:»
address myContacts [5] = {...}
Второй набор фигурных скобок говорит, "инициализировать первую структуру в массиве следующим образом:"
address myContacts[5] = {
{ ... } , // each of these braces initializes a different struct in the
{ ... } , // array (there are five inner brace sets as there are five
{ ... } , // structs in the array).
{ ... } ,
{ ... }
}
Обратите внимание, что это хорошая форма, чтобы инициализировать все элементы массива за раз, или использовать для этого цикл for.Вот почему ваша первоначальная инициализация смущает меня;Я не уверен, что это «правильно», даже если он работает.
Затем вы помещаете в них больше фигурных скобок (если вы все еще хотите выполнить инициализацию фигурных скобок для этого приложения), чтобы инициализировать массивы вstruct:
address myContacts[5] = {
{{'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'},
{'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'},
{'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0, '\0', '\0'} },
.
.
.
}
Это способ «обнуления» вашего массива сначала с помощью скобочной записи.Не слишком много людей делают это;это становится утомительным.Обычно для реального приложения люди используют кучу (память, которую вы можете выделить на лету, как показано ниже) для чего-то подобного, в этом случае вы можете просто использовать указатели в своей структуре:
typedef struct contact {
char *cFirstName;
char *cLastName;
char *iTelphone;
} address ; // end type
Затем вы должны выделить список контактов:
address *myContacts = (address*) malloc(sizeof(address)*5);
// the above allocates a five-element array
int i;
for (i = 0; i < 5; i++)
{
myContacts[i].cFirstName = NULL;
myContacts[i].cLastName = NULL;
myContacts[i].iTelephone = NULL;
}
выделить строки, когда вам нужно добавить в адресную книгу:
myContacts[0].cFirstName = (char*) malloc(sizeof(char)*20);
strcpy(myContacts[0].cFirstName,"Tom, Dick, or Harry");
и когда вы закончите, освободите всеВы выделили:
int i;
for (i = 0; i < 5; i++)
{
if (myContacts[i].cFirstName != NULL) // since we initialized all pointers
{ // to null, this only isn't null when
free(myContacts[i].cFirstName); // it's been previously allocated
}
if (myContacts[i].cLastName != NULL)
{
free(myContacts[i].cLastName);
}
if (myContacts[i].iTelephone != NULL)
{
free(myContacts[i].iTelephone);
}
}
Это позволяет вам создавать строки переменной длины, произвольно большие списки контактов, и если вы хотите проверить, является ли запись пустой, просто проверьте, является ли она указателемis null:
if (myContacts[i].cFirstName != NULL)
{
printf("%s", myContacts[i].cFirstName ); //does work!
}
Я надеюсь, что эта концепция, по крайней мере, окажется полезной для вас, даже если вы в конечном итоге не используете malloc (есть веские причины за или против ее использования в каждой программе).:)