有什么技巧可以在同一张表中得出不同类型的结论?

时间:2019-01-01 18:21:50

标签: c arrays function pointers

如何在表中添加不同的类型?首先,我必须创建一个函数,以便在表中添加我吃的食物(char),卡路里(int)和我吃的时间(float)最大[100][4]

我在大学里可以用于该项目的唯一知识是指针和表,而不是结构(这也是我一直在思考的解决方案)

我尝试了很多事情,而我所做的唯一一件事就是只在第一栏中填入食物名称。

for (j=0;j<4;j++){
    if (j==0){
        printf ("Add your food:\n");
                    //char
        scanf("%s",&table[n][j]);
    }else if (j==1){
        printf ("Add calories:\n");
                    //int
        scanf("%d",&table[n][j]);

    }else if (j==2){
        printf ("Add the time you ate:\n");
                    //float
        scanf("%.2f",&table[n][j]);
    }else if (j==3){
        printf ("Kati\n");
    }
}

我希望我的代码能显示我填写的所有数据,但是当然不起作用。那么,有什么解决方案可以在表中添加不同的类型?

2 个答案:

答案 0 :(得分:1)

  

在表中添加其他类型? ...指针和表格,非结构..
  ...作为char * table [100] [4] ...

将所有数据另存为 strings 。将类型/值转换为具有足够信息的字符串,以便以后重新构造类型/值。

#include <float.h>
#include <stdlib.h>
void table_add(char *table[100][4], size_t index, const char *food, int calories, float hour) {
  table[index][0] = strdup(food);
  char buf[42]; // large enough for a 128 bit `int`
  sprintf(buf, "%d", index);
  table[index][1] = strdup(buf);
  sprintf(buf, "%.*e", FLT_DECIMAL_DIG - 1, index);
  table[index][2] = strdup(buf);
  table[index][3] = NULL;  // Unclear what OP needs a 4th element for
}

用法

#define FOOD_SIZE 50

char *table[100][4] = { 0 };

for (index = 0; index < 100; index++) {
  char food[FOOD_SIZE];
  printf ("Add your food:\n");
  scanf("%49s",food);

  int calories
  printf ("Add calories:\n");
  scanf("%d",&calories);

  float hour;
  printf ("Add the time you ate:\n");  // Unclear why OP is using float for `time`
  scanf("%f", &hour);

  printf ("Kati\n");

  table_add(table, index, food, calories, hour);
}

// now use the data somehow
index = ...
food = table[index][0];
calories = atoi(table[index][1]);
hour = atof(table[index][2]);
printf("Food:%s Calories:%d Time:%.2f\n", food, calories, hour);

// When done, free all allocations
for (index = 0; index < 100; index++) {
  for (j = 0; j < 4; j++) {
    free(table[index][j]);
  }
}

有关FLT_DECIMAL_DIG - 1sprintf(buf, "%.*e", FLT_DECIMAL_DIG - 1, index);的详细信息,请参见Printf width specifier to maintain precision of floating-point value

答案 1 :(得分:0)

免责声明这不是通用解决方案,几乎在所有情况下,都有更好的方法来进行此练习。但这就是您的分配限制所要求的

在C语言中,允许使用指针作为其他任何类型的指针的别名(尽管在取消引用此类指针方面有特殊限制),因此您必须在您的数组中键入pun (在您放弃类型安全性时通常会有风险)。修改您的代码示例将如下所示(我发现循环和分支会影响可读性,因此删除了它们):

printf ("Add your food:\n");
// 50 is just to showcase, replace with actual value in your code
table[n][0] = malloc(50 * sizeof(char));
scanf("%s",table[n][0]);

printf ("Add calories:\n");
table[n][1] = malloc(sizeof(int));
scanf("%d",(int*)table[n][1]);

printf ("Add the time you ate:\n");
table[n][2] = malloc(sizeof(float));
scanf("%f",(float*)table[n][2]);

printf ("Kati\n");

还要记下我对scanf行所做的更改,以确保传入的指针具有实际正确的类型。由于您malloc数组的所有元素,因此您还需要记住在程序的末尾free全部,以避免内存泄漏。

编辑如OP所述,table被定义为char* table[100][4]