Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8

Scanf_s массив структур в функции по указателю

17.10.2025, 14:39. Показов 1115. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Начал изучать Си и возникли проблемы. Бьюсь над этим три недели.

В функции DataEntry при вводе числовых значений запись происходит правильно, а вот со строковыми значениями беда
при каждом вводе строки во всех предыдущих переменных сохраняется последнее введенная строка. т.е. при запросе введите Имя это имя также сохраняется и в Фамилии или при вводе названия Урок введенная строка сохраняется во всех строковых переменных. Что я делаю не правильно?

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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
typedef struct
{
    int number;
    char* Surname;//фамилия
    char* Name;//имя
    char* Patronymic;//отчество
    char* Gender;//Пол М или Ж
    int Number_class;//класс обучения
    char* Lesson_name;//наименование предмета
    int Grade;//оценка успеваемости
}Person;
 
static void DataEtry(Person *n, int coun)//Ввод данных
{
    char a[20];
    int b=0;
 
    n[coun].number = (n[coun]).number + 1;
    printf("%d\n", (int)(n[coun]).number);
 
    printf("Фамилия:  ");
    scanf_s("%s", a , (unsigned)_countof(a));
    n[coun].Surname = a;
    printf("%s\n", (n[coun]).Surname);
 
    printf("Имя:  ");
    scanf_s("%s", a, (unsigned)_countof(a));
    n[coun].Name = a;
    printf("%s\n", (n[coun]).Name);
 
    printf("Отчество:  ");
    scanf_s("%s", a, (unsigned)_countof(a));
    n[coun].Patronymic = a;
    printf("%s\n", (n[coun]).Patronymic);
 
    printf("Пол: М или Ж:  ");
    scanf_s("%s", a, (unsigned)_countof(a));
    n[coun].Gender = a;
    printf("%s\n", (n[coun]).Gender);
 
    printf("Класс:  ");
    scanf_s("%d", &b);
    n[coun].Number_class = b;
    printf("%d\n", (int)(n[coun]).Number_class);
 
    printf("Урок:  ");
    scanf_s("%s", a, (unsigned)_countof(a));
    n[coun].Lesson_name = a;
    printf("%s\n", (n[coun]).Lesson_name);
 
    printf("Оценка:  ");
    scanf_s("%d", &b);
    n[coun].Grade = b;
    printf("%d\n", (int)(n[coun]).Grade);
}
 
static void printSpiski(Person* n)
{
    printf("№\tФамилия\t\tИмя\t\tОтчество\tПол\tКласс\tПредмет\t\t\tОценка\n\n");
    for (int i = 0; n[i].number > 0; i++)
    {
        printf("%d", (int)n[i].number);
        printf("\t%s", n[i].Surname);
        printf("\t\t%s", n[i].Name);
        printf("\t\t%s", n[i].Patronymic);
        printf("\t%s", n[i].Gender);
        printf("\t%d", (int)n[i].Number_class);
        printf("\t%s", n[i].Lesson_name);
        printf("\t%d\n", (int)n[i].Grade);
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Person DataPerson[31] = {0};
 
    int a = 0;
    DataEtry(&DataPerson,a);
    printSpiski(&DataPerson);
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2025, 14:39
Ответы с готовыми решениями:

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

Ошибка времени выполнения при использовании функции scanf_s
Есть код создания библиотеки книг, это его часть. Если потребуется могу скинуть весь код, но он без...

Как добавлять в библиотеку отсутствующие функции, типа scanf_s, printf_s ?
Хочу добавить в библиотеку данные функции, чтоб не исправлять код каждый раз.

7
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.10.2025, 15:01
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
Что я делаю не правильно?
Присваиваешь указателям указатель на локальные данные функции, массив a.
После выхода из функции, эти указатели уже невалидные.
0
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8
17.10.2025, 15:47  [ТС]
Можно более подробно, а то я не понимаю.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.10.2025, 16:48
Подробно об указателях и Си-строках(она же Нуль-терминированная строка) написано в книгах по программированию.

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
#include <stdio.h>
 
int main(){
   char* ptr = NULL;
   
   char str[] = "Some";
   ptr = str; // указывает на начало массива str
   printf("%s\n", ptr);
   
   char str2[] = "Other";
   ptr = str2; // указывает на str2
   printf("%s\n", ptr);
   
   {
      char str[255] = "Some";
      ptr = str; // указывает на str
      scanf("%s", ptr); // вводим данные в str, на который указывает ptr
      printf("%s\n", ptr);
 
      scanf("%s", ptr); // ещё раз запрашиваем ввод, в тот же массив str, на который указывает ptr
      printf("%s\n", ptr);
 
      printf("%s\n", str);      
   }
}
Добавлено через 5 минут
C++
14
15
16
   {
      char str[255] = "Some";
      ptr = str; // указывает на str
Тут, ptr указывает на локальный str блока обозначенного фигурными скобками.
Использовать указатель ptr ссылающийся на него за пределом этого блока нельзя.
Эта память уже не используется или используется для других нужд(других данных).
0
Windows must die
664 / 864 / 103
Регистрация: 23.11.2021
Сообщений: 5,113
Записей в блоге: 18
17.10.2025, 17:22
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
не понимаю
Везде, где ты приравниваешь указатели на строки в функции, воткни strdup. Только в деструкторе не забудь потом все это почистить.
Короткий пример:
Code
1
2
3
4
5
6
static char *ptr = NULL;
void fn(){ 
  char buf[32];
  snprintf(buf, 31, "Something\n");
  ptr = buf;
}
В данном случае массив buf создается на стеке, соответственно, когда ты приравняешь глобальный указатель к нему, то пока находишься внутри функции, все ОК. А как только выйдешь, этот указатель получится "вникуда". В лучшем случае там будет мусор, в худшем - сегфолт.

А вот такой пример:
Code
1
2
3
4
5
6
7
8
static char *ptr1 = NULL, *ptr2 = NULL;
void fn(){ 
  static char buf[32];
  snprintf(buf, 31, "Something\n");
  ptr1 = buf;
  snprintf(buf, 31, "Something more\n");
  ptr2 = buf;
}
Предлагаю тебе самому сказать, что будет внутри функции с указателями, и что - снаружи.
И обратить внимание на то, что теперь buf - static. Вот только указатели будут ссылаться на одно и то же…
1
17.10.2025, 18:46

Не по теме:

Цитата Сообщение от Eddy_Em Посмотреть сообщение
в деструкторе
Откуда в Си деструкторы?
Цитата Сообщение от Eddy_Em Посмотреть сообщение
на стеке
Цитата Сообщение от Eddy_Em Посмотреть сообщение
static
Прям валишь его на засыпку.)
Ещё и путаешь.

0
Windows must die
664 / 864 / 103
Регистрация: 23.11.2021
Сообщений: 5,113
Записей в блоге: 18
17.10.2025, 18:57
Цитата Сообщение от SmallEvil Посмотреть сообщение
Откуда в Си деструкторы?
Ну, если ты думаешь, что мусор за тебя кто-то уберет - вперед! Потом не удивляйся, что "внезапно" 32ГБ оперативки к концу подошли…
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ещё и путаешь.
Не путаю, смотри внимательно: в первом примере на стеке, во втором - в сегменте data.

Добавлено через 4 минуты
А в качестве примера конструкторов и деструкторов на С приведу ссылку на свой недавний код: конструктор и деструктор.
В С++, конечно, чуть приятней сделали сборку мусора (и деструкторы зачастую автоматом вызываются), а вот в С приходится все руками делать… Не нужен объект - освободи.
ООП в С у меня более-менее сносно работает, главными недостатками вижу: отсутствие явного наследования (косвенное не очень удобно) и отсутствие указателя this (из-за чего приходится одним из аргументов всех функций объекта давать указатель на него самого).
Но все равно мне С нравится куда больше, чем С++. А уж когда смотришь на код, написанный на C++23, то не сразу понимаешь, что это - С++, а не жаба какая-нибудь или что-то еще…
0
17.10.2025, 19:25

Не по теме:

Ого какая эпическая чушь.
На асемблере тоже есть деструкторы?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2025, 19:25
Помогаю со студенческими работами здесь

Динамические массивы структур;Классы. Класс массивы структур;Классы. Класс динамического массива структур.
Здраствуйте.Помогите с практичкой мое задание 4.3. Строка таблицы данных содержит следующую...

scanf_s
Объясните, пожалуйста, в чём смысл этой строчки? scanf_s(&quot; %&quot;, stroka_1, 10);

Ищу информацию про scanf_s
Друзья, киньте кто-нибудь ссылку про scanf_s Для ссылок есть поисковые системы!

Отличие scanf от scanf_s
Скажите, пожалуйста, чем отличается функция scanf() от scanf_s()? У меня Visual Studio, и при...

Scanf_s строка формата
как с помощью строки формата в scanf_s задать такой ввод что есть произвольное количество символов...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru