如何在表中添加不同的类型?首先,我必须创建一个函数,以便在表中添加我吃的食物(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");
}
}
我希望我的代码能显示我填写的所有数据,但是当然不起作用。那么,有什么解决方案可以在表中添加不同的类型?
答案 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 - 1
中sprintf(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]