【问题标题】:is it possible to make an array with multiple types of data?是否可以制作具有多种数据类型的数组?
【发布时间】:2021-02-24 13:28:19
【问题描述】:

我是编码新手,目前使用 c 语言编写, 我必须编写一个程序来读取用户给出的 N 个元素并将它们保存在一个数组中。程序必须生成一个新数组,其中:

  1. 第一个数组中的每个重复数字在第二个数组中只能出现一次
  2. 第一个数组中的每个 0 不必出现在第二个数组中

它必须与整数、字符和浮点数一起使用;它必须有两个版本,一个是随机元素,一个是用户给定的。

这是我现在所拥有的,它适用于整数和字符,但不适用于浮点数

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


int main()
{
    // asks input for array size
    int maxnum;
    printf("How long will the array be? ");
    scanf("%d", &maxnum);
    fflush(stdin);

    char array[maxnum];
    char answer;

    do
    {
        // asks if user wants to input elements or prefers random
        printf("Would you like to input characters (i) or generate random ones (r)?: ");
        scanf("%c", &answer);
        fflush(stdin);
    }
    while(answer != 'i' && answer != 'r');

    if(answer == 'i')
    {
      // asks input for elements of the array
        printf("Enter %d characters for the array: ", maxnum);
        for(int i = 0; i < maxnum; i++)
        {
            scanf("%30s", &array[i]);
        }
    }
    else if(answer == 'r')
    {
        srand(time(0));
        printf("Characters for the array: ", maxnum);
        for(int i = 0; i < maxnum; i++)
        {
            // generates a random number as the element of the array
            array[i] = (rand() % (126 - 33 + 1)) + 33;
            printf("%c ", array[i]);
        }
    }
    printf("\n");

    // loop that goes on for the length of the array
    for(int i = 0; i < maxnum; i++)
    {
        // if the element is a 0, it is deleted from the array
        if(array[i] == '0')
        {
            for(int k = i; k < maxnum; k++)
            {
                array[k] = array[k + 1];
            }
            // the length of the array is shortened by one
            maxnum--;
        }

        // checks the next element
        for(int j = i + 1; j < maxnum;)
        {
            // if the next element is the same, it is deleted
            if(array[i] == array[j])
            {
                for(int k = j; k < maxnum; k++)
                {
                    array[k] = array[k + 1];
                }
                maxnum--;
            }
            else
            {
                j++;
            }
        }
    }

    // prints final array
    printf("Final array: ");
    for(int i = 0; i < maxnum; i++)
    {
        printf("%c ", array[i]);
    }


    printf("\n\n\n");
    return 0;
}

【问题讨论】:

  • 您所拥有的实际上不适用于ints,尝试执行int > 256 看看会发生什么。
  • 不,C 中不可能有多个类型的数组。请编辑您的帖子以提供:预期和当前行为、输入/输出、需要帮助的具体问题。

标签: arrays c types


【解决方案1】:

C 2018 6.2.5 20 说:

数组类型描述了一个连续分配的非空对象集合,具有特定的成员对象类型,称为元素类型

因此数组中的每个元素都必须具有相同的类型。

要在数组中记录不同的类型,可以使用结构和联合。

结构声明的一个例子是:

struct CIF
{
    char  c;
    int   i;
    float f;
};

这将创建一个名为 struct CIF 的类型。它拥有一个charint一个float。您可以使用struct CIF x; 创建此类结构的实例。然后你可以使用.name访问结构的成员来访问名称为name的成员:

struct CIF x;
x.c = 'A';
x.i = 7;
x.f = 11.25;

联合声明的一个例子是:

union CIF
{
    char  c;
    int   i;
    float f;
};

这将创建一个名为 union CIF 的类型。它拥有charintfloat。联合的每个成员都使用相同的内存,因此写入一个会覆盖其他内存。通常,您一次只使用一个成员:

union CIF x;
x.c = 'A';
printf("The char is %c.\n", x.c);
x.i = 7;
printf("The int is %d.\n", x.i);
x.f = 11.25;
printf("The float is %g.\n", x.f);

您可以使用结构和联合的组合来保存各种类型中的一种以及指示当前在联合中的类型的代码:

struct CIF;
{
    char type;
    union
    {
        char  c;
        int   i;
        float f;
    } u;
};

现在我们可以使用结构的type 成员来记住联合成员中的类型。工会成员被命名为u。我们将使用字符'c''i''f' 作为代码,但我们可以编写任何我们喜欢的代码:

struct CIF x;
x.type = 'i';
x.u.f  = 11.25;
switch (x.type)
{
    case 'c':
        printf("x contains a character, %c.\n", x.u.c);
        break;
    case 'i':
        printf("x contains an int, %d.\n", x.u.i);
        break;
    case 'f':
        printf("x contains a float, %g.\n", x.u.f);
        break;
    default:
        printf("x contains an invalid type code.\n");
        break;
}

然后我们可以创建一个由这些结构组成的数组:

struct CIF x[10];
x[3].type = 'i';
x[3].u.f  = 11.25;
switch (x[3].type)
{
    case 'c':
        printf("x[3] contains a character, %c.\n", x[3].u.c);
        break;
    case 'i':
        printf("x[3] contains an int, %d.\n", x[3].u.i);
        break;
    case 'f':
        printf("x[3] contains a float, %g.\n", x[3].u.f);
        break;
    default:
        printf("x[3] contains an invalid type code.\n");
        break;
}

两点供进一步考虑:

  • 使用enum 声明的枚举可用于代码。
  • 成员名称u 可能会被排除在结构内的union 之外。这将创建一个匿名联合。它的成员成为结构的“直接”成员,因此可以使用x.cx.i.x.f 而不是x.u.cx.u.ix.u.f 来访问它们。

【讨论】:

  • 在这种特殊情况下,将数组中的所有内容保存为字符串可能会更容易,因为看起来 OP 并不需要真正使用这些元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多