Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 4
1

Почему структуру выводит только последние введенные данные типа char*?

05.04.2019, 21:21. Просмотров 294. Ответов 1

Не могу понять почему выводит только последние введенные данные. Как выводит и как должно быть, пример в коде есть.
Можете объяснить почему не работает, как задумано и как это исправить? Уже неделю думаю и пытаюсь понять...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdlib.h>
#define PN printf("\n");
 
/* 
Как выводит:
 
Какое у тебя имя? ->Денис
Какая у тебя фамилия? ->Денисов
Какая у тебя должность? ->пилот
Какой у тебя стаж? ->23
Какое у тебя имя? ->Михаил
Какая у тебя фамилия? ->Попов
Какая у тебя должность? ->Разраб
Какой у тебя стаж? ->32
 
Вы Михаил Попов
И ваша должность: Разраб со стажем в 32 лет
Вы Михаил Попов
И ваша должность: Разраб со стажем в 23 лет
 
_________________________________
 
Как должно выводить:
 
Какое у тебя имя? ->Денис
Какая у тебя фамилия? ->Денисов
Какая у тебя должность? ->пилот
Какой у тебя стаж? ->23
Какое у тебя имя? ->Михаил
Какая у тебя фамилия? ->Попов
Какая у тебя должность? ->Разраб
Какой у тебя стаж? ->32
 
 
 
Вы Михаил Попов
И ваша должность: Разраб со стажем в 32 лет
Вы Денис Денисов
И ваша должность: пилот со стажем в 23 лет
*/
 
 
 
struct works {
    char *name, *surname, *type;    // имя, фамилия, дложность
    int time;   // стаж
    struct works *next;
};
 
struct works *creater(struct works *, char *, char *, char *, int); // создание структуры
void list(struct works *);  // вывод структуры 
 
int main(){
    char *name, *surname, *type;
    name = (char*)malloc(30);
    surname = (char*)malloc(40);
    type = (char*)malloc(20);
    struct works *head;
    head = NULL;
 
    int time, n, i; // стаж, n - количество строчек
    scanf("%d", &n);
    for(i=0;i<n;i++){
        printf("Какое у тебя имя? ->"); scanf("%30s", name);
        printf("Какая у тебя фамилия? ->"); scanf("%40s", surname);
        printf("Какая у тебя должность? ->"); scanf("%20s", type);
        printf("Какой у тебя стаж? ->"); scanf("%d", &time);
        head = creater(head, name, surname, type, time);
        // printf("Вы %s %s\nИ ваша должность: %s со стажем в %d лет", (head)->name, (head)->surname, (head)->type, (head)->time);
    }
    list(head); // выводим
    free(head);
    return 0;
}
 
 
struct works *creater(struct works *head, char *name, char *surname, char *type, int time)
{
    struct works *element;
    (element) = (struct works *)malloc(sizeof(struct works));  // выделяем память новому элементу
    (element)->name = name;
    (element)->surname = surname;
    (element)->type = type;
    (element)->time = time;
    (element)->next = head;
    return element;
};
 
void list(struct works *p)
{
    PN PN PN
    while(p != NULL)    // пока не конец цикла
    {
            printf("Вы %s %s\nИ ваша должность: %s со стажем в %d лет", p->name, p->surname, p->type, p->time);
            PN
            p=p->next;
    }
    PN
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2019, 21:21
Ответы с готовыми решениями:

Измените структуру CStash чтобы данные хранились в объекте типа vector<char>
Измените структуру CStash чтобы данные хранились в объекте типа vector&lt;char&gt; //hello.h struct...

Составить схему алгоритма и программу для следующего задания, используя только данные символьного типа (char)
Составить схему алгоритма и программу для следующего задания, используя только данные символьного...

Как удалить последние N элементов из массива типа char?
Здравствуйте. Написал программу, но в ней маленький недочет-нужно удалить 3 последних символа...

Выводит только последние цифры
Есть код: numbers = list(range(1, 1_000_000 + 1)) for value in numbers: print(value) ...

1
73 / 54 / 24
Регистрация: 15.05.2013
Сообщений: 170
06.04.2019, 08:35 2
(element) = (struct works *)malloc(sizeof(struct works)); // выделяем память новому элементу
(element)->name = name;
(element)->surname = surname;
(element)->type = type;
(element)->time = time;
(element)->next = head;
Вот тут каждый элемент в списке ссылается на одни и те же строки name, surname, type. Надо каждому элементу выделять память для его собственных строк и копировать в них передаваемые со ввода значения. Можно использовать strdup(), например. Тогда
element->name = strdup(name);
и т.д.

И подключи заголовок string.h (для strdup).

Кстати, скобки вокруг element совершенно излишни.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2019, 08:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Строки: почему компилятор пишет , что переменная типа char несовместима с const char?
char pass; int password( int d) { int m; char p; cout &lt;&lt; &quot;Введите пароль для доступа к...

Сохранить данные, введенные в TextBox, в переменной типа string
Здравствуйте, подскажите как в Visual Studio 2013 создать TextBox и прикрепить к нему...

Выводит из файла.тхт последние данные два раза
product(std::ifstream&amp; fin) { fin&gt;&gt;Name; fin&gt;&gt;Belok; fin&gt;&gt;Gur; fin&gt;&gt;Yglevod;...

Наследование классов: почему производный класс не учитывает данные, введенные в базовом?
Почему при компилляции производный класс не учитывает данные, введенные в базовом? #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.