Изменить массив строк из структуры - PullRequest
0 голосов
/ 14 января 2019

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

char *names[2] = {"John","Doe"};
printf("%s\n",*((names)));
printf("%s\n",*((names)+1));

Я не могу воспроизвести это при использовании структуры.

Я пробовал и с john.names = {"John","Doe"};, и с john.*names = {"John","Doe"}. Но я получаю ожидаемую ошибку выражения.

Однако я могу сделать это во время инициализации с помощью Person john = {{"John","Doe"}};. Так что я не уверен, разрешено ли так действовать только во время инициализации.

main.h

typedef struct Person Person;

struct Person
{
    char *names[2];
};

main.c

#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int main()
{
    Person john = {{"John","Doe"}};
    john.names = {"John","Doe"}; // Expected expression error
    printf("%s\n",john.names[0]);
    printf("%s\n",john.names[1]);
    return 0;
}

Каким было бы "ожидаемое выражение", мне разрешено это делать?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Массивы не являются элементами первого класса в C. Вы можете инициализировать полный массив, но вы можете только назначить элементам, не являющимся массивами, то есть скалярам, ​​указателям или структурам.

Когда вы пишете

char *names[2] = {"John","Doe"};

, это инициализация, а не присвоение. И следующее присваивание также захлебнется синтаксической ошибкой:

char *names[2];
names = {"John","Doe"};    // syntax error here
0 голосов
/ 24 января 2019

Ну, я думаю, что могут быть способы доступа к содержимому структуры, способ, которым я узнал это на моей стороне для структуры, выглядящей так //

typedef struct struc_person { char *name[2]; } type_person;

type_person->name[0] = value_of_the_first_name;

type_person->name[1] = value_of_the_surname;
0 голосов
/ 14 января 2019

Для инициализации определенного поля / атрибута вы можете сделать что-то вроде следующего во время объявления:

Person john = {.names = {"John","Doe"}};

Чтобы инициализировать дополнительные поля, скажем, address и names, это можно сделать следующим образом:

Person john = {.names = {"John","Doe"}, .address="foo"};

После объявления вам нужно будет указать индекс массива.

john.names[0] = "John"

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