Konahrik16 Ответов: 2

Как хранить несколько значений с помощью массивов, функций и структур в языке Си?


У меня нет проблем с инициализацией данных в массиве struct.

Однако если я хочу сохранить, скажем, "First "в первой записи структуры и" Next " во второй записи структуры, программа отображает кучу случайных данных.

Которые не то, что я хочу, чтобы это сделать.

В настоящее время программа отображает:

Имя 1 : Init
Имя 2 : Init
Имя 3 : Init etc .. ect..

Вместо этого я хочу, чтобы он хранил и отображал:

Имя 1: Боб
Имя 2: Алиса
Имя 3: Джон и т. д..

Что я уже пробовал:

#include <stdio.h>
#define SIZE 2

struct date
{
    int day;
    int month;
    int year;
};

struct record
{
    char first_name[11];
    char surname[21];
    struct date DOB;
    int height;
    char eye_color;
    int weight;
};

void init_struct(struct record *ptr);
void display_struct(struct record data[SIZE]);

int main(void)
{
    struct record data[SIZE], *ptr = &data;

    init_data(ptr);
    display_data(data);

    return 0;
}

void display_data(struct record data[SIZE])
{
    int i;
    for(i = 0; i < SIZE; i++)
    {
        printf("Details of struct %d:\n\n", i + 1);
        printf("First name %d: %s\n", i + 1, data[i].first_name);
        printf("Surname %d: %s\n", i + 1, data[i].surname);
    }
}

void init_data(struct record *ptr)
{
    int i, j;
    for(i = 0; i < SIZE; i++)
    {
        printf("Enter details for struct %d\n\n", i + 1);
        printf("First name: ");
        scanf("%10s", (*(ptr + i)).first_name);
        printf("Surname: ");
        scanf("%20s", (*(ptr + i)).surname);
    }
}

2 Ответов

Рейтинг:
2

OriginalGriff

Во-первых, это вообще не будет компилироваться во многих системах: вам не хватает некоторых прямых объявлений. Вы также должны включить ссылку на string.h
Тогда попробуйте изменить свое задание:

ptr = &data;
К
ptr = data;

Как "целая программа", это должно работать:
#include <stdio.h>
#include <string.h>
#define SIZE 7

struct record
{
    char name[11];
};

void init_struct(struct record *ptr);
void display_struct(struct record data[SIZE]);
void display_data(struct record data[SIZE]);
void init_data(struct record *ptr);

int main(void)
{
    struct record data[SIZE];
    init_data(data);
    display_data(data);

    return 0;
}

void display_data(struct record data[SIZE])
{
    int i;
    for(i = 0; i < SIZE; i++)
    {
        printf("Name %d : %s\n", i + 1, data[i].name);
    }
}

void init_data(struct record *ptr)
{
    int i;
    for(i = 0; i < SIZE; i++)
    {
        strcpy(ptr[i].name, "Init");
    }
}


Рейтинг:
2

Patrice T

Вам нужно правильно выучить с, Эта книга является справочником для С.
Вы также можете найти учебные пособия.
Использование отладчика также может помочь вам понять, что не так в вашей программе.

Вот ссылки на справочники книг по Си от авторов этого языка.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]
-----
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.