Есть ли какой-нибудь совет для вывода разных типов в одной таблице? - PullRequest
0 голосов
/ 01 января 2019

Как добавить разные типы в таблицу?Во-первых, я должен создать функцию, чтобы добавить еду, которую я съел (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 голосов
/ 01 января 2019

добавить разные типы в таблицу?... указатели и таблицы, НЕ структуры ..
... как char * table [100] [4] ...

Сохранить все данные как строки ,Преобразуйте тип / значение в строку с достаточной информацией, чтобы позже восстановить тип / значение.

#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 для поддержания точности значения с плавающей точкой .

0 голосов
/ 01 января 2019

Отказ от ответственности Это не универсальное решение, почти во всех случаях есть лучшие способы сделать такое упражнение.Однако это то, что ваши ограничения присваивания требуют для

. В 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 их все в конце вашей программы, чтобы избежать утечек памяти.

EDIT Как прокомментировал OP,table определяется как char* table[100][4]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...