Программирование на C - передача указателя на массив - PullRequest
2 голосов
/ 05 мая 2010

Как передать значение указателя в массив структуры;

Например, на TXT у меня есть это:

John Doe;xxxx@hotmail.com;214425532;

Мой код:

typedef struct Person{
    char name[100];
    char email[100];
    int phone;
}PERSON;

int main(){
   PERSON persons[100];
    FILE *fp;
    char *ap_name;
    char *ap_email;
    char *ap_phone;
    char line[100];
    fp=("text.txt","r");
    if(fp==NULL){
        exit(1);
    }
    else{
        fgets(line,100,fp);
        ap_name=strtok(line,";");
        ap_email=strtok(NULL,";");
        ap_phone=strtok(NULL,";");
    } 
    return 0;
}

Мой вопрос: как я могу передать значение ap_name, ap_email, ap_phone в структуру? И мне нужно использовать все эти указатели?

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

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

Возможно, вы захотите сделать элемент phone строкой, а не целым числом (номера телефонов обычно содержат нечисловые символы). Если это действительно int, используйте atoi или strtol для преобразования строки ap_phone в int, а затем просто присвойте это значение телефону.

1 голос
/ 05 мая 2010

Имя и адрес электронной почты относительно просты; просто используйте strcpy (или strncpy);

strncpy(persons[i].name, ap_name, sizeof persons[i].name - 1);

Это скопирует содержимое строки, на которую указывает ap_name, в поле имени структуры. Максимум sizeof persons[i].name - 1 (100 - 1 или 99) символов будет скопировано в persons[i].name, и если длина строки, на которую указывает ap_name, меньше, чем 99, то 99 - стр. ASCII 0) прилагаются. То же самое для электронной почты:

strncpy(persons[i].email, ap_email, sizeof persons[i].email - 1);

Обратите внимание, что это предполагает, что длина ap_name и ap_email всегда будет меньше, чем целевые буферы; как написано, ваш код в значительной степени гарантирует это, но дополнительная проверка работоспособности не может быть плохой идеей.

Что касается номера телефона, обычный int может быть (и, скорее всего, не будет) достаточно широким, чтобы содержать 10-значный номер, при условии, что вы храните код города или добавочные номера (минимальный диапазон, гарантируемый языковой стандарт [-32767,32767]). Не говоря уже о том, что телефонные номера обычно представлены нечисловыми символами, например (999)-999-9999. Вы также можете сохранить эту информацию в виде строки.

EDIT

Другой альтернативой для номера телефона является использование более широкого числового типа (желательно без знака):

struct PERSON {
   ...
   unsigned long phone;
   ...
};

и затем преобразовать строку, используя strtoul():

persons[i].phone = strtoul(ap_phone, NULL, 10);

Библиотечная функция strtoul() преобразует строковое представление числа в эквивалентное числовое значение.

0 голосов
/ 05 мая 2010

Я не уверен, что это то, что вы спрашиваете, но:

Когда у вас есть структура, доступ к каждому члену осуществляется только с помощью. оператор.

persons[0].name
persons[3].email
persons[10].phone

Все действующие операторы получают имя 0-го лица, адрес электронной почты 3-го лица или номер телефона 10-го лица. Каждая из них является отдельной переменной, которую можно рассматривать как что-либо еще.

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