Почему символ «а» не конвертируется в 97 автоматически?

char input1;
std::cout << "input1 : ";
std::cin >> input1;

int input2;
std::cout << "input2 : ";
std::cin >> input2;

std::cout << input1 << std::endl;
std::cout << input2 << std::endl;

return 0;

Я написал «а» на входе 1 и «а» на входе 2.

Ouput is like this.
input1 : a
input2 : a
a
-858993460

Мне любопытно … Устав — 97 декабря. почему он печатает -858993460?
«а» не конвертируется в 97 автоматически? Зачем?

3

Решение

aкак строка не может быть преобразована в int по правилам std::cin следующим образом. Учти это: a не является допустимым целым числом в базе 10. std::cin не сможет конвертировать строка "a" для int,

Причина это печатает -858993460 потому что int не инициализируется, поэтому может печатать что-либо или ничего, или делать все, что пожелает (поиск неопределенного поведения).

Попробуйте что-то вроде этого:

char input2_chr;
std::cin >> input2_chr;
int input2 = input2_chr;
18

Другие решения

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

Если вы попытаетесь прочитать целое число, символ «а» недопустим, поэтому он не будет принят >> оператор.

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

6

Во-первых, вы попросили ввести символ, поэтому вы получили первый
непробельный символ в потоке. Во втором вы попросили
введите целое число, чтобы поток пропускал пробелы (как это всегда происходит с
>>) и попытался разобрать целое число. поскольку "a" не может быть
начало целочисленного значения, поток устанавливает состояние ошибки (
failbit) и вернулся, без модифицирующий input2, Когда вы выводите
неинициализированная переменная, у вас есть неопределенное поведение. (Вам следует
никогда использовать введенную переменную без предварительной проверки, является ли
ввод выполнен успешно или нет.)

Из того, что вы описываете, звучит так, как будто вы пытаетесь ввести некоторые
двоичный формат Для этого вы должны открыть поток в двоичном режиме,
убедитесь, что он пропитан "C" локаль, а затем использовать
istream::get или же istream::read, (Конечно, вы должны знать, что
двоичный формат, который вы читаете, чтобы иметь возможность
преобразовать неформатированные байты, которые вы прочитали, в фактическую информацию, которую вы
необходимость.)

3

Как например Аардвард уже ответил, вы видите произвольное исходное значение в стандарте C ++, называемое неопределенное значение, потому что операция ввода не удалась и input2 не было назначено новое значение.

Вывести десятичное представление значения char переменная, просто конвертировать в int для того, чтобы направить поток вывода для обработки как целое число.

Самый простой способ преобразовать его в int это поощрить скрытое продвижение используя переменную в выражении, например, просто добавив + знак перед ним:

#include <iostream>
using namespace std;

int main()
{
char const  ch  = 'a';
cout << "'" << ch << "' = " << +ch << endl;
}

Выход:

'а' = 97
3

Потому что вы читаете целое число в input2. a не целое число Поэтому ничего не будет прочитано, а первоначальное значение input2 будет поддерживаться

В этом случае это будет какое-то случайное значение, причина input2 не инициализирован.

Вы можете проверить успешность чтения, проверив cin.good()

2
По вопросам рекламы [email protected]