Как использовать строку в структуре в связанном списке? - PullRequest
0 голосов
/ 10 марта 2020

В моем коде у меня есть 2 структуры с именами villa и apartment. У них есть члены типа char*. Когда в моей записи void я получаю от пользователя другие части структур, такие как villa1.price (который является float), он работает, но когда дело доходит до char*, я не могу читать строки, используя scanf("%s",&villa1.city), и поэтому я использовал другой массив символов с именем v1, чтобы получить информацию от пользователей и затем присвоить ее Villa1.city с помощью villa1.city=a1.

Это сработало впервые, но я хочу создать связанный список. Первый раз, когда я отправляю villa1.city на insertFirstVilla, чтобы добавить это в связанный список, он работает, но когда я добавляю второй узел, villa1.city в первом узле теряется, и это происходит каждый раз, когда я добавляю новый узел.

Как я могу получить данные от пользователя, такие как villa1.price, или если невозможно скопировать их, чтобы данные оставались безопасными, когда я добавляю второй узел в свой список. Я публикую часть своего кода для villa, но код такой же для apartment.

struct villa
{
    float built;
    float garden;
    float price;
    int floors;
    char* city;
    char* ST;
    char* alley;
    char* postal_code;
}villa1;
struct nodev
{
    villa info;
    nodev* next;
}*headv = NULL;
void insertFirstvilla(float built, float garden,float price,int floor, char*city) {
    nodev* link = (nodev*)malloc(sizeof(nodev));

    link->info.built = built;
    link->info.garden = garden;
    link->info.price = price;
    link->info.floors = floor;
    link->info.city = city;
    link->next = headv;
    headv = link;
}
void record()
{
    char a;
    printf("is the building apartment? (y/n):");
    scanf("%c", &a);
    char a1[100];
    char v1[100];
    if (a == 'y')
    {
    /*  printf("enter apartment features:");
        printf("\nenter built area:");
        scanf("%f", &apart.built);
        printf("\nenter basic price:");
        scanf("%f", &apart.price);
        printf("\nenter floors number:");
        scanf("%d", &apart.floor_no);
        printf("\ndoes apartment have elavator(if there is no elavotor enter zero else enter one):");
        scanf("%d", &apart.elevator);
        printf("\nenter city:");
        scanf("%s", &a1);
        apart.city = a1;
        insertFirstapartment(apart.built, apart.price, apart.floor_no, apart.elevator,apart.city);
        writetofilea(apart.built, apart.price, apart.floor_no, apart.elevator, apart.city);*/

    }
    else if (a == 'n')
    {
        printf("enter villa features:");
        printf("\nenter built area:");
        scanf("%f", &villa1.built);
        printf("\nenter garden area:");
        scanf("%f", &villa1.garden);
        printf("\nenter basic price:");
        scanf("%f", &villa1.price);
        printf("\nenter floors number:");
        scanf("%d", &villa1.floors);
        printf("\nenter city:");
        scanf("%s", &v1);
        apart.city = v1;
        insertFirstvilla(villa1.built, villa1.garden, villa1.price, villa1.floors, villa1.city);
        writetofilev(villa1.built, villa1.garden, villa1.price, villa1.floors, villa1.city);
    }
    getchar();
}
int main()
{
    int t = 0;
    while (t<4)
    {
        record();
        t++;
    }
}

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Например, читая город:

char a1[100];
scanf("%99s", a1);  // an array will be passed as an address, so no need for &
apart.city = malloc(strlen(a1)+1);   // ask for memory
strcpy(apart.city, a1);              // copy it

или используйте strdup, который сделает это за вас:

char a1[100];
scanf("%99s", a1);  // an array will be passed as an address, so no need for &
apart.city= strdup(a1);              // get memory and copy it
0 голосов
/ 10 марта 2020

Основная проблема c заключается в глубоком копировании по сравнению с мелким копированием.

struct villa
{
  int floors;
  char* city;
};

villa V1, V2;
char buffer[10];
strcpy(buffer, "Venice");
V1.city = buffer; /* This copies nothing. V1.city now points to buffer. */
V2 = V1;          /* This is a shallow copy. V2.city now points to buffer. */
strcpy(buffer, "Moscow");
printf("%s\n", V2.city); /* prints Moscow */

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

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