как изменить переменную в массиве структуры без изменения других - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь изменить переменную в объекте struct. Но каждый раз, когда я меняю его, меняются и другие объекты.

Вот моя структура

    struct room{
    char * S;
    char * N;
    char * W;
    char * E;
    char  South;
    char  North;
    char  West;
    char  East;
    char * Name;
   };

и вот блок, который я запускал в основном методе

int numOfRooms=0;
struct room * rooms;
rooms=(struct room*)malloc(sizeof(*rooms));
do{

rooms=(struct room*)realloc(rooms,sizeof(*rooms)*(numOfRooms+1));
fscanf(fp,"%s%c",name,&temp);
printf("%s ",name);
printf("%d",numOfRooms);
rooms[numOfRooms].Name=name;
printf("%s ",rooms[0].Name);

numOfRooms++;

}while(temp!='\n');

и вывод: START 0START FOYER 1FOYER ELEVATOR 2ELEVATOR

что должно быть: НАЧАТЬ 0 НАЧАТЬ Фойе 1 НАЧАТЬ ЛИФТ 2 НАЧАТЬ

это моя проблема. Каждый раз, когда я пытаюсь изменить Name в моей структуре, меняются и имена предыдущих. имя было объявлено

char string[20];
char defa[16]="No Path This Way";
char temp;
char * input;
char * name=string;

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Когда вы делаете это:

rooms[numOfRooms].Name=name;

Вы заставляете Name указывать на то же, на что указывает name. не копирует значение.Это означает, что все ваши room экземпляры имеют своих членов Name, указывающих на одно и то же место.

Вы должны использовать strdup, чтобы создать новую динамически размещаемую строку из той, которую вы используете для чтения пользователявведите:

rooms[numOfRooms].Name=strdup(name);

Обязательно наберите free в этом поле, когда вы закончите с ним.

0 голосов
/ 24 апреля 2018

переменная name не объявлена.

Скорее всего, это неправильный способ присвоения переменной.
(но поскольку вы не показали объявление name,трудно быть уверенным)

rooms[numOfRooms].Name=name;  // Use Strcpy, strdup, or similar.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...