访问元素并将其输入到 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);
^^ ^
您的代码存在几个问题:
- 您分配的内存远远不够。如果你的元组标识符是 100 个字符,你应该分配 至少
101 * sizeof(char) + 3*sizeof(int)
字节的内存。实际上,这可能还不够,因为编译器可能会填充结构以更好地与内存对齐。因此,实际尺寸可能更大。安全的做法是分配 sizeof(tuple_t)
字节
- 用于读取标识符的
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);
}
}
}
}
我正在尝试访问我的动态结构数组中的不同元素,但是我似乎无法访问数组中除了第一个元素之外的任何其他元素。
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);
^^ ^
您的代码存在几个问题:
- 您分配的内存远远不够。如果你的元组标识符是 100 个字符,你应该分配 至少
101 * sizeof(char) + 3*sizeof(int)
字节的内存。实际上,这可能还不够,因为编译器可能会填充结构以更好地与内存对齐。因此,实际尺寸可能更大。安全的做法是分配sizeof(tuple_t)
字节 - 用于读取标识符的
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);
}
}
}
}