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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

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

20.10.2012, 16:26. Просмотров 1995. Ответов 20
Метки нет (Все метки)

Хотелось бы считать 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 подействовал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2012, 16:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считать char числом (C++):

Семафоры - можно ли считать ноль положительным числом? - C++
подскажите 1. sem_wait(sem_t* sem); – «ожидание на семафоре». Выполнение потока блокируется до тех пор, пока значение семафора не станет...

считать из файла и определить является прочитанное числом - C++
Здравствуйте. В общем нужно произвести чтение из файла и определить является ли прочитанное числом в общем случае и целым в частности....

Считать из файла в массив char - C++
Имеется массив char, в который из файла нужно считать строку. Для считывания использую данную команду: ifile.getline(str, sizeof(str)); ...

Считать посимфольно из файла в char вектор - C++
Например в файле записаны: aaaaaaa bbbbbbb надо считать первую строчку в вектор char посимвольно, потом происходит сравнение с другим...

Считать файл в переменную типа char, и работать посимвольно - C++
считать файл в переменную типа char, а дальше с ней нужно работать посимвольно, так вот, как написать while(пока это не последний символ...

Считать с файла строку типа char до знака окончания строки - C++
Всем доброго времени суток. Мне нужно считать с файла строку типа char до знака окончания строки ( '\0'). Как мне это сделать? Я...

20
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.10.2012, 16:42 #2
"%hhu" или "%hhi" (для unsigned и signed char соответственно).

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

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

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

Добавлено через 1 час 56 минут
~OhMyGodSoLong~,
в таком подходе меня беспокоит исчезновение \n. Боюсь, как бы это потом проблем не вызвало
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 10:10 #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;
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 10:15  [ТС] #10
alsav22, _getch, getch, getchar, scanf("%c") не видят \n, хотя он остался. Cin.get() или cin.ignore() его видят
А по поводу первых \n и игнора scanf'а я писал выше, что вкурсе дела.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 10:28 #11
Цитата Сообщение от nexen Посмотреть сообщение
будешь вводить %c сам, в него \n не запишется.
scanf(), так же как и cin, вообще, не читает (т.е. не помещает туда, куда идёт чтение) '\n'.

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

Добавлено через 2 минуты
Цитата Сообщение от nexen Посмотреть сообщение
alsav22, я говорю, что в моём случае "код в посте 9" не выводит ничего, пока я не введу ещё один символ
Что значит "ещё один"? Вводится только одно число. scanf() его читает, '\n' остаётся в потоке, getchar() извлекает его и помещает в someChar. На экран выводится 10.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 10:56  [ТС] #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 и прочие?
Мне нужно его не поймать, а убить, ибо, если он все-таки остался, то при следующем чтении я могу его поймать случайно (ибо я уже не понимаю, какого лешего он ловится одними и не ловится другими).
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:12 #15
Цитата Сообщение от nexen Посмотреть сообщение
Я лишь ввожу сам новый символ
Не знаю, как у вас, (какая среда?), но у меня ничего вводить не нужно. getchar() автоматом извлекает '\n' (так же, как и cin.get()) и код идёт дальше. Никакого ожидания, для второго ввода нет ( у меня, по крайней мере).
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2012, 11:12
Привет! Вот еще темы с ответами:

Как считать из файла текст в двумерный массив типа char и отсортировать в алф. порядке? - C++
Постановка задачи: Исходные данные считать из текстового файла через отдельную функцию. Дана строка символов, состоящая из...

Считать из текстового файла информацию начинающую со слова "example" и закачивающуюся числом 555 - C++
Считать из текстового файла информацию начинающую со слова &quot;example&quot; и закачивающуюся числом 555 нужно считать ее и записать в другой...

Определить разность между наибольшим числом и наименьшим числом последовательности - C++
вот задание и сама программа,в ней ошибка ,но незнаю какая. Помогите пожалуйста! Даны вещественные числа A1, A2, A3, ... . Признак...

Проверка является ли строка числом полностью числом или нет? - C++
как проверить является ли строка типа &quot;23уар&quot; полностью числом или нет?


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
21.10.2012, 11:12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru