Вопрос по коду Си/с++

программирование C++ с++ си

Есть задание:
Разработать битовое поле, описывающее состояния элементов прибора. Ввести с консоли число в 16-ричной системе счисления, преобразовать его в битовое поле за счёт использования объединения. Вывести на консоль состояния элементов прибора, соответствующие состоянию битов во введённом числе.
Варианты приборов и их элементов:
Клавиатура. Элементы: NumLock вкл/выкл, CapsLock вкл/выкл, ScrollLock вкл/выкл.

По заданию написана программа:

#include <cstdio>
#include <iostream>
typedef unsigned char BYTE;

union UrrU
{
BYTE a;
struct
{
BYTE numl:1;
BYTE scroll:1;
BYTE caps:1;
}flag;
};

void main()
{
UrrU zetrum;
scanf("%h",&zetrum.a);
printf("0 -- off\n1 -- on\nCaps: %d NumLock: %d ScrollLock: %d\n",zetrum.flag.caps,zetrum.flag.numl,zetrum.flag.scroll);
}

Вопрос:
Почему при вводе любого числа, какого бы то не было, в выводе все равно получается 1 0 0?
Есть другой вариант кода:

#include <cstdio>
#include <iostream>
typedef unsigned char BYTE;

struct BitVale
{
BYTE numl:1;
BYTE scroll:1;
BYTE caps:1;
};

union UrrU
{
struct BitVale flag;
BYTE a;
};

void main()
{
UrrU zetrum;
scanf("%h",&zetrum.a);
printf("0 -- off\n1 -- on\nCaps: %d NumLock: %d ScrollLock: %d\n",zetrum.flag.caps,zetrum.flag.numl,zetrum.flag.scroll);
}

Но в таком случае опять же программа выдает злосчастные 1 0 0
Как это можно исправить и что в этом коде не так?

Примечание:
Нашел ошибку, исправил. Была банальная ошибка на попытку чтения %h. Нужно читать %x. Но теперь выдает ошибку "Stack around the variable "zetrum" was corrupted"
Ответы:
Судя по пасте на этот код - скорее всего, проблема у вас в вводе.


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.