有没有办法在C中有一个2D数组,它有整数和字符?

时间:2017-12-16 13:45:13

标签: c arrays char int

我正在编写一个要求2D数组的代码,在该数组中有玩具的名称及其成本。所以我想知道是否有可行的方式,因为我尝试过它并没有真正起作用。

5 个答案:

答案 0 :(得分:2)

每个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];

答案 1 :(得分:1)

我不确定您的代码是否要求使用2d数组。我想象一组结构更合乎逻辑:

struct toy {
    char *name;
    double price;
}

struct toy toys[NUMBER];

答案 2 :(得分:1)

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

struct Data{
    char *str;
    int n;
};

struct Data data[SIZE] // Array of struct of SIZE struct Data

答案 3 :(得分:1)

迈向解决方案......

这就是为什么有一种叫做结构的东西。您将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可以在其中包含不同的类型,因此它为我们提供了所需的内容。

答案 4 :(得分:1)

我对你的问题(标题)的理解是,你需要一系列名称或数字的东西

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

C本身没有和类型,但为您提供raw union types,可用于构建总和类型。请参阅this example

也许你只想要一组同名和数字的东西......然后:

如果您只想要一个product type(例如 一个名称和费用的一系列事物),请使用a struct

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

Pointers在C中也很重要。我不敢在这里解释原因。你需要阅读一些优秀的C编程书(解释C dynamic heap allocation以及为什么以及何时数组衰减为指针)。 virtual address spacepointer aliasing的概念几乎是重要的。

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

我的感觉是你并不真正需要2D阵列,但我不知道你的整体问题,我可能错了。

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

BTW,C11规范可以下载为n1570(但它不是C编程的介绍)。

请忘记使用GCC gcc -Wall -Wextra -g的{​​{3}}编译所有警告和调试信息。改进您的代码以获得警告。然后是is