Доступ и ввод элементов в динамический массив структур в C - PullRequest
0 голосов
/ 17 декабря 2018

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

C-файл

#include <stdio.h>
#include <stdlib.h>
#include "tuples.h"

void createTuple();

int main() {
    createTuple();
    return 0;
}

void createTuple(){

    int numOfTup;

    printf("How many tuples would you like to create:\n");
    scanf(" %d", &numOfTup);

    tuple_t *tuples;

    tuples = malloc(numOfTup * sizeof(char) * sizeof(int) * 3);

    if (tuples == NULL){
        printf("Memory allocation failed");
        exit(EXIT_FAILURE);
    }

    for (int j = 0; j < numOfTup; ++j) {

        printf("Enter an identifier for the Tuple: \n");
        scanf(" %c", &tuples[j].identifier);

        printf("TUPLE: %c\n",tuples[j].identifier);

        for (int i = 0; i < 4; ++i) {
            printf("Enter the value for the tuple (C:I:I:I)\n");
            if (i == 0) {
                scanf(" %c", &tuples[j].val0);
            } else if (i == 1) {
                scanf(" %d", &tuples[j].val1);
            } else if (i == 2) {
                scanf(" %d", &tuples[j].val2);
            } else if (i == 3) {
                scanf(" %d", &tuples[j].val3);
            }
        }
    }

}

Заголовочный файл для структуры

#ifndef TASK2_TUPLES_H
#define TASK2_TUPLES_H

struct tuple{
    char identifier[100];

    char val0;
    int val1;
    int val2;
    int val3;
};

typedef struct tuple tuple_t;


#endif //TASK2_TUPLES_H

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

Также при вводе идентификатора компилятор пропускает цикл и не позволяет мне вводить какие-либо элементы в структуру.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Есть несколько проблем с вашим кодом:

  1. Вы выделяете недостаточно места для памяти.Если ваш идентификатор кортежа равен 100 символам, вы должны выделить как минимум 101 * sizeof(char) + 3*sizeof(int) байтов памяти.На практике этого может быть недостаточно, потому что компилятор может дополнить структуру для лучшего выравнивания с памятью.Таким образом, реальный размер может быть больше.Безопасная вещь, которую нужно сделать - это выделить sizeof(tuple_t) байтов
  2. Ваша функция scanf для чтения идентификатора читает символ, а не строку.используйте %s для чтения строки.Кроме того, scanf ожидает указатели на уже выделенные объекты типа, указанного их соответствующим спецификатором формата, в нашем случае %s - это строка, поэтому тип должен быть char *.Таким образом, параметр должен быть tuples[j].identifier, а не &tuples[j].identifier

В целом:

#include <stdio.h>
#include <stdlib.h>
#include "tuples.h"

void createTuple();

int main() {
    createTuple();
    return 0;
}

void createTuple(){

    int numOfTup;

    printf("How many tuples would you like to create:\n");
    scanf(" %d", &numOfTup);

    tuple_t *tuples;

    tuples = malloc(numOfTup * sizeof(tuple_t));

    if (tuples == NULL){
        printf("Memory allocation failed");
        exit(EXIT_FAILURE);
    }

    for (int j = 0; j < numOfTup; ++j) {

        printf("Enter an identifier for the Tuple: \n");
        scanf("%s", tuples[j].identifier);

        printf("TUPLE: %s\n",tuples[j].identifier);

        for (int i = 0; i < 4; ++i) {
            printf("Enter the value for the tuple (C:I:I:I)\n");
            if (i == 0) {
                scanf(" %c", &tuples[j].val0);
            } else if (i == 1) {
                scanf(" %d", &tuples[j].val1);
            } else if (i == 2) {
                scanf(" %d", &tuples[j].val2);
            } else if (i == 3) {
                scanf(" %d", &tuples[j].val3);
            }
        }
    }

}
0 голосов
/ 17 декабря 2018

Для начала, утверждение:

tuples = malloc(numOfTup * sizeof(char) * sizeof(int) * 3);
                           //always ==1      why?      why?

должно выглядеть больше как:

tuples = malloc(numOfTup * sizeof(*tuples));

и:

scanf(" %c", &tuples[j].identifier);//wrong format specifier for string
       ^^^   ^                      //and address of ( & ) operator not needed for string.  

Должно быть:

scanf("%s", tuples[j].identifier);
       ^^   ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...