Ошибка при вводе. Структуры C++

377
29 января 2021, 14:10

Необработанное исключение по адресу 0x00007FF86C6A8028 (ucrtbase.dll) в Project1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00007FF6178C1A06.

Меняю спецификаторы в scanf %s например на %i перестает выходить эта ошибка, но смысл естественно теряется.

#include <stdio.h>
#include <locale>
#define ARR_SIZE 2
typedef struct HUM_RES_DEP
{
    char Position[20];
    char SecName[15];
    char Init[2];
    int Year;
    int WorkExp;
    int Salary;
}HUM_RUS_DEP;
void BubleSort(HUM_RES_DEP *arr);
void InPut(HUM_RES_DEP *arr);
void OutPut(HUM_RES_DEP *arr);

int main()
{
    setlocale(LC_ALL, "Russian");
    HUM_RES_DEP arr[ARR_SIZE];
    InPut(arr);
    BubleSort(arr);
    OutPut(arr);
    system("pause");
    return 0;
}
void BubleSort(HUM_RES_DEP *arr)
{
    HUM_RES_DEP temp;
    for (int i = 0; i<ARR_SIZE; i++){
        for (int j = 0; j<(ARR_SIZE - 1); j++){
            if (arr[j].SecName>arr[j + 1].SecName){
                temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        };
    };
}
void InPut(HUM_RES_DEP *arr)
{
    printf("Введите данные:\n|  Должность   |  Фамилия  | Инициалы | Год рождения | Стаж работы, мес |  Оклад |\n");
    for (int i = 0; i<ARR_SIZE; i++){
        scanf_s("%s %s %s %d %d %d", &arr[i].Position, &arr[i].SecName, &arr[i].Init, &arr[i].Year, &arr[i].WorkExp, &arr[i].Salary);
    };
}
void OutPut(HUM_RES_DEP *arr)
{
    printf("   __________________________________________________________________________________________");
    printf("\n|                                       Отдел Кадров                                       |");
    printf("\n|__________________________________________________________________________________________|");
    printf("\n|  Должность   |   Фамилия   |  Инициалы   | Год рождения |  Стаж работы, мес  |   Оклад   |");
    printf("\n|______________|_____________|_____________|______________|____________________|___________|");
    for (int i = 0; i<ARR_SIZE; i++){
        printf("\n|%10s| %10s| %10s| %10d| %10d| %10d|", arr[i].Position, arr[i].SecName, arr[i].Init, arr[i].Year, arr[i].WorkExp, arr[i].Salary);
        printf("\n|______________|_____________|_____________|_____________|_____________________|___________|");
    };
}
Answer 1

В отличие от scanf и wscanf, scanf_s и wscanf_s требуют указания размеров буфера для некоторых параметров. Указать размеры для всех c, C, s, S, или строка, набор элементов управления [] параметры. Размер буфера в символах передается как дополнительный параметр. Непосредственно за указатель на буфер или переменную. Например если вы читаете строку, размер буфера для этой строки передается следующим образом:

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9

Пользуйтесь простым scanf.

READ ALSO
Ошибка в подключении jQuery

Ошибка в подключении jQuery

Хотел подключить jQuery, но выдает массу ошибок, как исправить не знаю ,скрины прилагаю:

128
Как выровнять input по центру?

Как выровнять input по центру?

не получается выровнять по центру формуУже всё попробовал

145
Размер кастомных иконок спиков css

Размер кастомных иконок спиков css

Существует некий список, в котором обязательно нужны кастомные иконки, сделал их через list-style-image: url(/img/gearwheel

128
Перенос строки через JavaScript

Перенос строки через JavaScript

Пишу небольшой чатКаждое новое сообщение нужно выводить с новой строки

136