Форум программистов, компьютерный форум CyberForum.ru

Считать char числом - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 16:26     Считать char числом #1
Хотелось бы считать char числом сразу. Конструкция типа
C++
1
scanf("%d", &someChar);
- подходит, но вызывает stack around .. corrupted-предупреждение. Решение вида
C++
1
2
3
 int someCharCopy; 
scanf("%d", &someCharCopy);
char someChar = char(someCharCopy);
нельзя использовать.
Есть какие-либо варианты?

Ещё вопрос. Я предполагал, что, даже если идти считыванием вида scanf("%d", &someChar), то в буфере отснается \n после ввода, но его нет. Куда он делся? О_о Обычно же scanf не ест \n после чисел? Или это на него так параметр вида char, приведенный к int подействовал?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.10.2012, 16:42     Считать char числом #2
"%hhu" или "%hhi" (для unsigned и signed char соответственно).

По второму затруднению: scanf кушает все пробелы, табы и переводы строки перед первым считываемым значением (если не это "%c"). Может, в этом дело.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 17:08  [ТС]     Считать char числом #3
~OhMyGodSoLong~, спасибо. Но по какой-то причине это вызывает stack around тоже..
А вот насчет второго, я знал, что он так делает, но почему кушает каретку после чтения числа - вопрос.. :<
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
20.10.2012, 17:15     Считать char числом #4
%d по идее ожидает 4-байтового хранилища, а ты даешь char, который лишь 1 байт.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 20:13  [ТС]     Считать char числом #5
Цитата Сообщение от Герц Посмотреть сообщение
%d по идее ожидает 4-байтового хранилища, а ты даешь char, который лишь 1 байт.
Да, я знаю. Но при чтении "hhu" на unsigned char выдается то же самое. Тут где переполнение "хранилища"? Мне бы решение :<

Добавлено через 2 часа 56 минут
Does anybody have an idea?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.10.2012, 20:49     Считать char числом #6
Цитата Сообщение от nexen Посмотреть сообщение
Я предполагал, что, даже если идти считыванием вида scanf("%d", &someChar), то в буфере отснается \n после ввода, но его нет. Куда он делся?
Вроде бы никуда и не делся. Если проверить так:
C++
1
2
3
char someChar;
scanf("%d", &someChar);
cout << (int)(cin.get()) << endl;
, то, после ввода числа, выведет 10.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.10.2012, 21:27     Считать char числом #7
Ну я даже не знаю. Раз майкрософтовская scanf() не умеет модификатор hh (переполнение потому и происходит, что %hhu считается как просто %u, то есть unsigned int), то безопасный вариант только один — вон тот с интом (плюс проверка границ).

Применяйте своё право разработчика сказать "эта фича нереализуема в данных условиях" что ли.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 09:07  [ТС]     Считать char числом #8
alsav22, а если так :
C++
1
2
scanf("%d", &someChar);
scanf("%c", &someChar);
будешь вводить %c сам, в него \n не запишется.

Добавлено через 1 час 56 минут
~OhMyGodSoLong~,
в таком подходе меня беспокоит исчезновение \n. Боюсь, как бы это потом проблем не вызвало
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 10:10     Считать char числом #9
Цитата Сообщение от nexen Посмотреть сообщение
будешь вводить %c сам, в него \n не запишется.
Потому что scanf(), так же как и cin, игнорирует первые пробельные символы и '\n', но это не значит, что его в потоке нет. Код, который подтверждает, что '\n' в потоке остался, я показал.

Добавлено через 6 минут
Цитата Сообщение от nexen Посмотреть сообщение
alsav22, а если так :
scanf("%d", &someChar);
scanf("%c", &someChar);
А если так:
C++
1
2
3
4
char someChar;
scanf("%d", &someChar);
someChar = getchar();
cout << (int)someChar << endl;
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 10:15  [ТС]     Считать char числом #10
alsav22, _getch, getch, getchar, scanf("%c") не видят \n, хотя он остался. Cin.get() или cin.ignore() его видят
А по поводу первых \n и игнора scanf'а я писал выше, что вкурсе дела.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 10:28     Считать char числом #11
Цитата Сообщение от nexen Посмотреть сообщение
будешь вводить %c сам, в него \n не запишется.
scanf(), так же как и cin, вообще, не читает (т.е. не помещает туда, куда идёт чтение) '\n'.

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
alsav22, _getch, getch, getchar, scanf("%c") не видят \n, хотя он остался.
А по поводу первых \n и игнора scanf'а я писал выше, что вкурсе дела.
Хотите сказать, что код в 9 посте не выведет на экран 10? Там getchar() используется.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 10:39  [ТС]     Считать char числом #12
alsav22, я говорю, что в моём случае "код в посте 9" не выводит ничего, пока я не введу ещё один символ, который и будет выведен.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 10:52     Считать char числом #13
Тогда не пойму о чём разговор. Зачем писать, что '\n' куда-то исчезает, что getchar() его не видит? Вы хотите его поймать, через scanf() ?

Добавлено через 2 минуты
Цитата Сообщение от nexen Посмотреть сообщение
alsav22, я говорю, что в моём случае "код в посте 9" не выводит ничего, пока я не введу ещё один символ
Что значит "ещё один"? Вводится только одно число. scanf() его читает, '\n' остаётся в потоке, getchar() извлекает его и помещает в someChar. На экран выводится 10.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 10:56  [ТС]     Считать char числом #14
alsav22, бл..ин..
Пишу я значит
C++
1
2
int someCharCopy;
scanf("%d", &someCharCopy);
после которого должна остаться '\n' в буфере.
При попытке поймать её способами :
C++
1
2
3
4
char a = getchar(); //или
char b = getch(); //или
char c;
scanf("%c", &c);
Я лишь ввожу сам новый символ (как если бы не было в потоке '\n', scanf и прочие ждут символа), хотя '\n' с буфера должна была уйти на символ.
Однако, написав то же самое с cin, я вижу, что '\n' уходит в char-переменную.
Вопрос почему и каким таким макаром игнорируются getch и прочие?
Мне нужно его не поймать, а убить, ибо, если он все-таки остался, то при следующем чтении я могу его поймать случайно (ибо я уже не понимаю, какого лешего он ловится одними и не ловится другими).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:12     Считать char числом #15
Цитата Сообщение от nexen Посмотреть сообщение
Я лишь ввожу сам новый символ
Не знаю, как у вас, (какая среда?), но у меня ничего вводить не нужно. getchar() автоматом извлекает '\n' (так же, как и cin.get()) и код идёт дальше. Никакого ожидания, для второго ввода нет ( у меня, по крайней мере).
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 11:14  [ТС]     Считать char числом #16
VS 2008
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:19     Считать char числом #17
Цитата Сообщение от nexen Посмотреть сообщение
хотя '\n' с буфера должна была уйти на символ.
Покажите, каким способом определяете, что не ушла.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
char someChar;
scanf("%d", &someChar);
someChar = getchar(); //без остановки извлечёт '\n'
cout << (int)someChar << endl; // вывод кода '\n'
char c;
c = getchar(); // здесь будет ждать ввода
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 11:32  [ТС]     Считать char числом #18
alsav22, да вы шутите, сударь, я уже 3 раза показывал и расписывал, как определяю, что что-то осталось!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:43     Считать char числом #19
Точный код можете написать с коментариями?

Добавлено через 2 минуты
Вот таким кодом проверяете?
C++
1
2
3
4
5
int someCharCopy;
scanf("%d", &someCharCopy);    
char a = getchar();
char c;
scanf("%c", &c);
Добавлено через 3 минуты
И если добавить:
C++
1
2
3
4
5
6
    int someCharCopy;
    scanf("%d", &someCharCopy);    
    char a = getchar();
    cout << (int)a << endl;
    char c;
    scanf("%c", &c);
, то у вас, что выводится на экран?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2012, 12:12     Считать char числом
Еще ссылки по теме:

C++ Считать из файла в массив char
C++ Считать из текстового файла информацию начинающую со слова "example" и закачивающуюся числом 555
Проверка является ли строка числом полностью числом или нет? C++

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

Или воспользуйтесь поиском по форуму:
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 12:12  [ТС]     Считать char числом #20
alsav22, в функции используется считывание переменной (которое я привел уже в районе 5-7 раз). Ещё она используется только в fwrite(&someChar, sizeof(someChar), 1, miFile); и нигде более.
Я проверил наверное все комбинации. scanf/getchar - не ловит и просит ввести символ. cin.get / .ignore ловит и игнорит. gets() для char *someString = new char[1]; ловит тоже.
Если поставить сначала getch (допустим), которые не словит, то после него хоть ты cin.get(), хоть .ignore ставь, '\n' нет и не было в помине и ничего его не поймает.
В первом случае просит дважды ввести символ.
Во втором случае просит дважды ввести символ.
Yandex
Объявления
21.10.2012, 12:12     Считать char числом
Ответ Создать тему
Опции темы

Текущее время: 17:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru