ошибочное поведение - PullRequest
       41

ошибочное поведение

4 голосов
/ 16 марта 2010

Я новичок в C ++. Ниже приведен небольшой пример кода:

int main(int argc, char* argv[]) {    

    char ch1;
    int int1;

    cin >> ch1;
    cin >> int1;

    cout << ch1 << '\n';
    cout << int1 << '\n';

    return 0;
}

Когда я запускаю программу и вводю следующее:

аз

Я получаю в качестве вывода:

а 32767

Я понимаю «а», но почему целое значение равно 32767? Я просто хочу проверить и посмотреть, что произойдет, если вместо числового значения, присвоенного int1, я использовал 'z'.

Я пытаюсь ввести:

ах

... и я тоже получаю такие же результаты.

Теперь, если вместо int int1 я использую short int1 и запускаю программу с вводом:

аз

Я получаю вывод:

а 0

приписка

sizeof(int) = 4
sizeof(short) = 2

Я использую 64-битный компьютер.

Ответы [ 4 ]

4 голосов
/ 16 марта 2010

Когда поток ввода не может прочитать действительные данные, он не меняет значение, которое вы передали. 'z' не является допустимым числом, поэтому int1 остается без изменений. int1 не был инициализирован, поэтому он имел значение 32767. Проверьте значение cin.fail () или cin.good () после чтения ваших данных, чтобы убедиться, что все работает так, как вы ожидаете.

1 голос
/ 16 марта 2010

cin >> int1; означает «прочитать целое число и поместить его в int1». Таким образом, вы кормите его z, который не является допустимым символом в целом числе, и он просто прерывает чтение и оставляет все, что в int1.

Проверьте это, инициализируя int1 чем-то и посмотрев, что произойдет.

0 голосов
/ 16 марта 2010

Использование cin напрямую, лично для меня, т. Е. Плохая идея для чтения данных в нетривиальных программах. Я предлагаю вам прочитать другой ответ, который я дал на аналогичный вопрос:

C ++ до int

0 голосов
/ 16 марта 2010

Поток c ++ cin выполняет проверку ввода для программы.

При потоковой передаче из cin в int cin будут приниматься только действительные номера didgits, -0123456789, а также только значения между INT_MIN и INT_MAX.

Если требуется числовое значение для z (122), я бы рекомендовал использовать функцию c getchar вместо потока cin.

int main(int argc, char* argv[]) {

    cout << "function main() .." << '\n';

    char ch1 = getchar();
    int int1 = getchar();
    cout << ch1 << '\n';
    cout << int1 << '\n';

    return 0;

}

Когда вводится az, выдается

a
122
...