我必须用C语言创建一个带尖数组的structs数组



为此,我从标准输入中给定的维度创建了一个指向数组,并为数组中的每个结构分配了内存。这有意义吗?我该如何解决这个问题?EDIT由于riga[x]是int,我如何将结构与数组连接起来?EDIT 2我需要创建一个结构数组,数组的维度在标准输入中给出。对不起,如果我不善言辞,我对这个还很陌生

#include <stdio.h>
#include <stdlib.h>
typedef struct {
char c;
int ni;
double nr;
}dati;
int main () {
int a,b,K;
int *riga;
printf("a b Kn");
scanf ("%d %d %d",&a,&b,&K);
printf("%d %d %dn", a, b, K);
riga= (int*) malloc(sizeof(int)*K);
printf("insert %d valors",K);
for (int k=0;k<K;k++)
scanf("%d", &riga[k]);
for(int p=0;p <K;p++)
printf("%dn", riga[p]);
for (int x=0; x>K;x++)
riga[x]=malloc(sizeof(dati));

for (int i=0; i<K; i++){
printf("insert data in line %d", i+1);
scanf("%c %d %lf", riga[i].c, riga[i].ni, riga[i].nr);
}
for (int j=0; j<K;j++)
printf("%c %d %lfn", riga[j].c,riga[j].ni,riga[j].nr);
exit(EXIT_SUCCESS);
}

它在第28行给我一个警告;警告:从"void*"到"int"的赋值使指针中的整数不带强制转换[-Wint conversion]">
以及打印结构体的错误";错误:在非结构或并集中请求成员"c";

您的变量riga需要是dati的数组。您还需要检查对scanf的调用是否成功。要跳过前导空格,需要在格式字符串的%c之前添加一个空格。为了让内存分配更容易,我总是使用宏函数。这里有一个解决方案:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NEW_ARRAY(pointer, length) 
{ 
(pointer) = malloc(((size_t) length) * sizeof (pointer)[0]); 
if ((pointer) == NULL) { 
fprintf(stderr, "Allocating memory failed: %sn", strerror(errno)); 
exit(EXIT_FAILURE); 
} 
}
typedef struct {
char c;
int ni;
double nr;
} dati;
int main(void)
{
dati *riga;
int K, n;
printf("Number of lines: ");
n = scanf("%d", &K);
if ((n == 1) && (K > 0)) {
NEW_ARRAY(riga, K);
for (int i = 0; i < K; i++) {
printf("insert data in line %d: ", i + 1);
n = scanf(" %c %d %lf", &riga[i].c, &riga[i].ni, &riga[i].nr);
if (n != 3) {
fprintf(stderr, "Character, integer and real number expected at line %dn", i + 1);
exit(EXIT_FAILURE);
}
}
for (int i = 0; i < K; i++) {
printf("%c %d %lfn", riga[i].c, riga[i].ni, riga[i].nr);
}
free(riga);
} else {
fprintf(stderr, "Non-negative integer expectedn");
exit(EXIT_FAILURE);
}
return 0;
}

您已经定义了int *riga。因此,您的前两个for循环将存储数据。也就是说,riga是指向int的1D阵列的指针。

所以,您的前两个for循环是可以的。


但是,在您的第三个for循环中,您会执行以下操作:

riga[x] = malloc(sizeof(dati));

您取消引用riga,因此这是int,但您正在分配指针


riga[再次]是指向int数组的指针,而不是指向struct数组的指针。因此,您可以而不是do(例如(:

riga[i].c

不清楚您有什么数据或希望如何存储。有两种解释:

  1. 您似乎想要输入两个独立的数组。首先,一个长度为Kint的简单1D数组,您称之为riga。并且,dati结构的单独数组,长度也是K
  2. 您只需要一个长度为K的结构dati数组

我已经重构了代码[有一些猜测],以确定您需要什么。

我选择解释(1(是因为它最接近您的代码。当riga引用您的dati结构时,我将其重命名为datarray

如果您想要(2(,只需删除下面与riga相关的代码。

我使用了cpp条件词来表示新旧代码:

#if 0
// old code
#else
// new code
#endif

这是调整后的代码[带有一些注释]:

#include <stdio.h>
#include <stdlib.h>
typedef struct {
char c;
int ni;
double nr;
} dati;
int
main(void)
{
int a, b, K;
printf("a b Kn");
scanf("%d %d %d", &a, &b, &K);
printf("%d %d %dn", a, b, K);
// this is interpretation (1) -- you want two separate arrays
#ifndef ONLY_ONE_ARRAY
#if 0
int *riga = (int *) malloc(sizeof(int) * K);
#else
int *riga = malloc(sizeof(*riga) * K);
#endif
printf("insert %d valors", K);
for (int i = 0; i < K; i++)
scanf("%d", &riga[i]);
for (int i = 0; i < K; i++)
printf("%dn", riga[i]);
#endif
// NOTE/BUG: riga is an int pointer so this is invalid
#if 0
for (int x = 0; x > K; x++)
riga[x] = malloc(sizeof(dati));
#else
dati *datarray = malloc(sizeof(*datarray) * K);
#endif
for (int i = 0; i < K; i++) {
printf("insert data in line %d", i + 1);
#if 0
scanf("%c %d %lf", riga[i].c, riga[i].ni, riga[i].nr);
#else
scanf("%c %d %lf", datarray[i].c, datarray[i].ni, datarray[i].nr);
#endif
}
#if 0
for (int i = 0; i < K; i++)
printf("%c %d %lfn", riga[j].c, riga[j].ni, riga[j].nr);
#else
for (int i = 0; i < K; i++)
printf("%c %d %lfn", datarray[i].c, datarray[i].ni, datarray[i].nr);
#endif
return EXIT_SUCCESS;
}

相关内容

  • 没有找到相关文章

最新更新