【问题标题】:Is there a way to have a 2D array in C, which has both integers and characters?有没有办法在 C 中创建一个包含整数和字符的二维数组?
【发布时间】:2017-12-16 13:45:12
【问题描述】:

我正在编写一个请求二维数组的代码,在该数组中有玩具的名称及其成本。所以我想知道是否有可能的方法,因为我尝试过它并没有真正奏效。

【问题讨论】:

  • 创建一个包含名称和成本的struct 数组。
  • 那么这可以在没有二维数组的情况下完成吗?
  • • 当程序加载时,用户可以将今年的礼物列表和每个礼物的价格输入到 PresentArray • 应该至少有 10 个不同的礼物,每个礼物应该有一个名字& 价格:o 例如娃娃,10 o 每件商品的价格应该在 5 到 15 之间
  • 请注意,SO 不是 do-my-homework 服务,因此您的问题是题外话......
  • 我可以想象有人可能会写一个文档,可能是在线玩具商店的一页,其中有一个包含两列的表格:左列中的玩具名称,以及它们的价格右栏。将这样的表格编码为二维数组是(几乎)永远不会正确的。谁说你需要一个二维数组,他们解释了原因吗?

标签: c arrays char int


【解决方案1】:

每个 C 数组只有一种元素类型,但该类型可以是结构或联合类型,或者是指向其中一种对象的指针类型。例如,

union int_or_string {
    int as_int;
    char *as_string;
};

union int_or_string[5][5];

但我想知道您是否真正想要的是一个 一维结构数组:

struct toy {
    char *name;
    int cost;
};

struct toy array[42];

【讨论】:

  • 如果你不介意我问 - 你有没有注意到一件事有玩具的名称和它们的成本。你建议工会这很好我会说- 但是要使用该 OP 需要记住哪个块正在使用哪种类型。不是吗?如果我错了,请纠正我。这正是我回避union 建议的原因。
  • @coderredoc,是的,要使用联合,程序确实需要知道哪些数组元素使用哪个联合成员。这不一定是大问题。例如,如果 OP 使用他的 2D 数组来存储表,那么数组索引可以传达每个应该使用的联合成员。也可以让工会在内部携带这类信息。但这些都不是问题的主题。
  • 是的,这正是我的想法。啊不,这没什么大不了的。但我只是想知道OP是否知道这一点。顺便说一句,很好的答案。现在的事情是这意味着现在索引将保存一些关于数据类型的信息,不是吗?是的,即使是其他解决方案也可以使用另一个数组来存储该信息。或者简单地嵌入 struct 那个联合并像那样使用它以及该类型信息(一个单独的变量)。但话又说回来,我们正朝着struct 解决方案前进。
【解决方案2】:

我不确定您的代码是否需要二维数组。我想象一个结构数组更合乎逻辑:

struct toy {
    char *name;
    double price;
}

struct toy toys[NUMBER];

【讨论】:

    【解决方案3】:

    数组是包含相同对象类型数据的数据结构。所以您的问题的答案是
    您可以为此目的使用结构。

    struct Data{
        char *str;
        int n;
    };
    
    struct Data data[SIZE] // Array of struct of SIZE struct Data
    

    【讨论】:

    • 好的,那么 struct 的数据类型是什么,我的意思是你会写 struct,就像你写一个整数一样 %d,struct 应该怎么写
    【解决方案4】:

    寻求解决方案...

    这就是为什么会有一种叫做结构的东西。您将name 和它们的price-s 放入一个结构中,然后将所有这些结构变量放入一个数组中。 (这里做了一个简单的演示,没有使用 2d 数组,而是使用 1d 结构数组)。

    示例(仅用于说明)

    struct toy{
       char name[100];
       double price;
    }
    
    struct toy toyArr[50];
    

    然后你会做类似的事情(获取输入)

    for(size_t i = 0; i < 50; i++){
       if( scanf("%lf",&toyArr[i].price) != 1){
         fprintf(stderr,"Error in input");
         exit(1);
       }
       if( scanf("%99s",toyArr[i].name) != 1){
         fprintf(stderr,"Error in input");
         exit(1);
       }
       ...
    }
    

    数组太严格了...

    此外,您对数组类型感到困惑§6.2.5

    数组类型描述了一个连续分配的非空集合 具有特定成员对象类型的对象,称为元素类型。1 只要数组类型是,元素类型就应该是完整的 指定的。数组类型的特征在于它们的元素类型和 数组中的元素数。数组类型被称为 派生自其元素类型,如果其元素类型为 T ,则 数组类型有时称为''array of T ''。建设一个 元素类型中的数组类型称为''array type derivation''

    1强调我的

    使用数组的方式(根据您的问题)。

    这应该是一个特定的成员对象类型,而不是类型的混合或任何你想的东西。

    我们可以通过使用 structure 等结构来超越这种严格的类型相似性,这些结构为我们提供了您想要的东西。然后数组也是类似的struct 类型,但由于struct 可以在其中包含不同的类型,它为我们提供了您需要的内容。

    【讨论】:

      【解决方案5】:

      我对您的问题(其标题)的理解是您想要一组名称或数字的东西

      从概念上讲,您需要一个 sum 类型,也称为 tagged union。您应该考虑abstract data types(因此首先记录您的 ADT 的所有操作)。 SICP 是一本免费提供的书,解释了这个概念(但它不使用 C),并且是一般编程的一个很好的介绍。

      C 本身没有 sum 类型,但为您提供 raw union types,可用于构建 sum 类型。见this example

      也许你只是想要一个包含名称和数字的数组......然后:

      如果您只想要一个product type(即具有名称和成本的事物数组),请使用a struct

      但是 C 中的 arrays 是由所有具有相同类型的组件组成的。它们总是一维的,但你可以用数组的数组来伪造二维数组。特别是,矩阵(不同维度的)在 C 中不存在,但您可以很容易地模仿它们(例如,通过为它们构建 own 抽象数据类型)。

      Pointers 在 C 语言中也很重要。我不敢在这里解释为什么。您需要阅读一些优秀的 C 编程书籍(解释 C dynamic heap allocation 以及数组衰减为指针的原因和时间)。 virtual address spacepointer aliasing 的概念实际上很重要。

      也许您不需要大量大部分为空的条目。在某些情况下,您应该考虑更复杂的data structures。阅读一些Introduction to Algorithms。也许你需要一些hash table。 C 本身并不提供这些,但为您提供了足够的基本构建块来实现它们(在您的 library 中)。

      我的感觉是你并不真的需要二维数组,但我不知道你的整体问题,我可能是错的。

      考虑同时研究一些现有free software 程序的源代码(例如github 或其他地方)。他们可以激励你(特别是因为coding conventions 在实践中非常重要)。

      顺便说一句,C11 规范可作为n1570 下载(但它不是对 C 编程的介绍)。

      不要忘记使用GCCis gcc -Wall -Wextra -g 编译所有警告和调试信息。改进您的代码以获得没有警告。然后use the debugger gdb

      【讨论】:

      • 我什至猜想 OP 需要阅读 几本书 (一本专注于编程,另一本专注于 C 编程语言)。
      • 是的,这是肯定的。但实际上有时这些问题变成了X-Y 问题——就像这里 OP 需要 2d 数组的可能性为 0.1%——但是 C 数组中不同类型的想法让 OP 想要一个。
      • 我相信 OP 希望别人做他的功课。我不认为 SO 是正确的网站。而且我也相信学生在没有网站帮助的情况下通过做功课学到更多东西。
      猜你喜欢
      • 2021-07-04
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2021-10-12
      • 2022-11-23
      • 1970-01-01
      相关资源
      最近更新 更多