C:在 for 循环中创建结构体数组

标签 c arrays struct

我正在尝试在循环中创建一个由结构组成的数组(或者可能创建结构数组?),该代码适用于单个结构,但我需要使用 losuj_liczbe 函数在循环中创建其中 5 个,以分配随机数。每次我收到此错误: 可变大小的对象可能无法初始化。 请帮忙!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define n 5

typedef enum
{
    Bialy,
    Czarny,
    Czerwony,
    Niebieski
}Kolor;

typedef enum
{
    Podstawowe,
    Standard,
    Premium
}Wyposazenie;

typedef struct Samochod
{
    int waga;
    int cena;
    Kolor kolor;
    Wyposazenie wyposazenie;
}Samochod;

int losuj_liczbe(int min, int max)
{
    int rolex;
    time_t tt;
    rolex=time(tt);
    srand(rolex);

    int temp;
    if (max >=min)
        max -= min;
    else{
        temp = min - max;
        min = max;
        max = temp;
    }
    return ((rand()% (max-min) + min));
}


int main()
{
    int i;
    Samochod automobil[n];
    for(i=0; i<n; i++){
    Samochod automobil[i] = {{.waga = losuj_liczbe(500,1500),
                .cena = losuj_liczbe(20000,30000),
                .kolor = ((0 == losuj_liczbe(0,3)) ? Bialy :(1 == losuj_liczbe(0,3)) ? Czarny :(2 == losuj_liczbe(0,3)) ? Czerwony : Niebieski),
                .wyposazenie = ((0 == losuj_liczbe(0,2)) ? Podstawowe :(1 == losuj_liczbe(0,2)) ? Standard : Premium)}};
    }
    printf("%d | %d | %s | %s",
           automobil.waga,
           automobil.cena,
           (0 == automobil.kolor) ? "Bialy" : (1 == automobil.kolor) ? "Czarny" : (2 == automobil.kolor) ? "Czerwony" : "Niebieski",
           (0 == automobil.wyposazenie) ? "Podstawowe" : (1 == automobil.wyposazenie) ? "Standard" : "Premium");

    return 0;
}

最佳答案

有很多问题:

仅举几例:

  • srand 只能在程序开始时调用一次。单个 srand(time(NULL)); 就足够了。阅读 srandtime 函数的文档
  • 第一次循环中automobil[i]的赋值全部错误
  • 您的 printf 是错误且毫无意义的,您需要执行另一个 for 循环来显示所有汽车。
  • 您需要在 printf 格式字符串的末尾添加 \n
  • 按照惯例,所有宏名称都应大写,因此您应该使用 #define NUMBEROFCARS 5,而不是 #define n 5。并且绝对应该避免短宏名称,例如 NAX。这只是一个可读性问题。

您可能想要这个:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUMBEROFCARS 5

typedef enum
{
  Bialy,
  Czarny,
  Czerwony,
  Niebieski
}Kolor;

typedef enum
{
  Podstawowe,
  Standard,
  Premium
}Wyposazenie;

typedef struct Samochod
{
  int waga;
  int cena;
  Kolor kolor;
  Wyposazenie wyposazenie;
}Samochod;

int losuj_liczbe(int min, int max)
{
  int temp;
  if (max >= min)
    max -= min;
  else {
    temp = min - max;
    min = max;
    max = temp;
  }
  return ((rand() % (max - min) + min));
}


int main()
{
  srand(time(NULL));

  int i;
  Samochod automobil[NUMBEROFCARS];

  for (i = 0; i < NUMBEROFCARS; i++) {
    automobil[i].waga = losuj_liczbe(500, 1500);
    automobil[i].cena = losuj_liczbe(20000, 30000);
    automobil[i].kolor = ((0 == losuj_liczbe(0, 3)) ? Bialy : (1 == losuj_liczbe(0, 3)) ? Czarny : (2 == losuj_liczbe(0, 3)) ? Czerwony : Niebieski);
    automobil[i].wyposazenie = ((0 == losuj_liczbe(0,2)) ? Podstawowe : (1 == losuj_liczbe(0,2)) ? Standard : Premium);
  }

  for (i = 0; i < NUMBEROFCARS; i++) {
    printf("%d | %d | %s | %s\n",
      automobil[i].waga,
      automobil[i].cena,
      (0 == automobil[i].kolor) ? "Bialy" : (1 == automobil[i].kolor) ? "Czarny" : (2 == automobil[i].kolor) ? "Czerwony" : "Niebieski",
      (0 == automobil[i].wyposazenie) ? "Podstawowe" : (1 == automobil[i].wyposazenie) ? "Standard" : "Premium");
  }

  return 0;
}

这个程序还是很尴尬,尤其是把颜色转换为颜色名称的可怕的三元表达式应该重构。

关于C:在 for 循环中创建结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46643741/

相关文章:

c - uint 结构数组上的 async_work_group_copy

c - Struct inside union, 串口状态

c - 动态链表到底是什么?

java - 如何在 SQLData.writeSQL() for Oracle 中将 java.sql.Array 写入 java.sql.SQLOutput

java.util.Scanner 读取不同字符编码的文件

javascript - Array.from 不能作为 Array#map 中的直接回调函数

c++ - 如何 "Overflow"超出特定范围(如 30 - 100)的值

c - 如何使用 WM_COPYDATA 在使用 JNI 的 Java 程序之间发送字符串?

c - 如何使用Cgreen在精度范围内进行测试?

c - 将输入文件标记为链表