Сохранение нескольких строк со структурой в C - PullRequest
1 голос
/ 26 мая 2020

со следующим кодом я могу сохранить только одну строку.

Основная проблема - как сохранить несколько. Если я хочу ввести другую строку после первой, она этого не сделает.

Я не писал ее в коде, но когда я набираю ("KRAJ"), она должна выйти из while l oop.

typedef struct{

    char Objekat[20+1];
    char Mjesto[20+1];
    char velicina [20];
    int cijena;
    char kn[3];
    char stanje[20];

}Apartmani;

int main()
{
  Apartmani *apartmani=(Apartmani*)malloc(sizeof(Apartmani)*50);



    while(scanf("%[^,\n],%[^,],%[^,],%d%[^,],%[^\n]", &apartmani[i].Objekat,&apartmani[i].Mjesto,&apartmani[i].velicina,
                &apartmani[i].cijena,&apartmani[i].kn, &apartmani[i].stanje  )==6)
    {

        i++;


    }
    for(p=0;p<i;p++)
    {
        printf("%s %s %s %d %s %s",apartmani[p].Objekat,apartmani[p].Mjesto,apartmani[p].velicina,apartmani[p].cijena,
               apartmani[p].kn, apartmani[p].stanje);

    }
}

Например: строка 1: Apartman, Novalja, 100.00 m2, 750000kn, dobro ocuvano.

строка 2: Kuca, Ivanbregovia, 20m2, Imtoski, 21252RH, vrijednost-neprocjenjiva.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020
  1. Вы должны использовать fgets() плюс sscanf().

  2. Вы не должны использовать malloc[Do I cast the result of malloc?][1]. Не забудьте проверить возвращаемое значение malloc, так как это может быть неудачным.

измените строку выделения apartmani на:

Apartmani *apartmani= malloc(sizeof(Apartmani)*50);
if(!apartmani) {return -1;}

Не используйте & для ввода строки.

Проверьте значение i, потому что его значение ограничено 50.

В вашем коде отсутствует объявление i (должно быть: int i = 0), а также объявление p.

Ваше while l oop может быть как показано ниже:

    int i = 0;
    char line[100];
    while(i < 50 && fgets(line,sizeof(line),stdin))
    {
        line[strcspn (line, "\n" )] = '\0'; // trip the enter character at the end of line.

        int err = sscanf(line,"%20[^,],%20[^,],%19[^,],%d,%2[^,],%19[^\n]", apartmani[i].Objekat,apartmani[i].Mjesto,apartmani[i].velicina,&apartmani[i].cijena,
               apartmani[i].kn, apartmani[i].stanje);
        if(err != 6)
            break;
        i++;

    }
0 голосов
/ 26 мая 2020

Если я вас правильно понял, вы хотите сохранить несколько построек «Апартаментов». В этом случае у вас есть 2 основных варианта:

  1. Использование массива структур (быстрее всего писать, но менее эффективно)
  2. Использовать связанный список (более эффективно, но сложнее в использовании)

Примеры

1: Использование массива структур

#define MAX_APARTMANI 50

int main(void) {
    int i = 0;
    /* Create Apartmani array */
    Apartmani *apartmani_tab[MAX_APARTMANI];

    do {
        /* loop by using malloc on a single element */
        apartmani_tab[i] = (Apartmani *) malloc(sizeof(Apartmani));
        /* While check using scanf */
    } while (scanf("%[^,\n],%[^,],%[^,],%d%[^,],%[^\n]", apartmani_tab[i]->Objekat, apartmani_tab[i]->Mjesto, apartmani_tab[i]->velicina,
            apartmani_tab[i]->cijena, apartmani_tab[i]->kn, apartmani_tab[i]->stanje) == 6 && ++i < MAX_APARTMANI)

    /* good pratice: don't forget to free memory ! */
    while (--i > 0) {
        free(apartmani_tab[i]);
    }
    return (0);
}

2: Использование связанного списка

typedef struct Apartmani {
    char Objekat[20+1];
    char Mjesto[20+1];
    char velicina [20];
    int cijena;
    char kn[3];
    char stanje[20];
    struct Apartmani *next;/* add pointer to next item in the list */
} Apartmani_t;

Apartmani_t *new_item(void) {
    Apartmani_t *new_element = NULL;

    new_element = (Apartmani_t *) malloc(sizeof(Apartmani));
    if (!new_element)
        return (NULL);
    memset(new_element, 0, sizeof(*new_element));
    new_element->next = NULL;
    return (new_element);
}

int main(void) {
    /* Initialize Apartmani list*/
    Apartmani *apartmani_list = NULL, *current = NULL;

    do {
        if (!apartmani_list) { /* if empty list */
            apartmani_list = new_item(); /* add first item */
            if (!apartmani_list) /* prevent malloc errors */
                break;
            current = apartmani_list; /* link current pointer to list */
        } else {
            current->next = new_item();
            if (!current->next) /* if malloc fails */
                break;
            current = current->next; /* update current pointer */
        }
    } while (scanf("%[^,\n],%[^,],%[^,],%d%[^,],%[^\n]", current->Objekat, current->Mjesto, current->velicina, current->cijena, current->kn, current->stanje) == 6) /* While check using scanf */

    /* good pratice: don't forget to free memory ! */
    while (apartmani_list) {
        current = apartmani_list->next;
        free(apartmani_list);
        apartmani_list = current;
    }
}

NB: у меня есть не пробовал этот код, но финальная версия, вероятно, очень близка к этому.

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