访问元素并将其输入到 C 中的动态结构数组中

Accessing and inputting elements into a dynamic array of structs in C

我正在尝试访问我的动态结构数组中的不同元素,但是我似乎无法访问数组中除了第一个元素之外的任何其他元素。

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] 中的结构,因为每当我尝试运行 它只保存第一组元素。

此外,无论何时输入标识符,编译器都会跳过循环,不允许我在结构中输入任何元素。

谢谢。

首先,语句:

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);
       ^^   ^

您的代码存在几个问题:

  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);
            }
        }
    }

}