С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

Считать char числом

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

Author24 — интернет-сервис помощи студентам
Хотелось бы считать 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2012, 16:26
Ответы с готовыми решениями:

Функция с переменным числом параметров char
Добрый день! Помогите разобраться с функциями с переменным числом параметров. Как перемещаться по...

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

Считать из файла и определить, является ли прочитанное числом
Здравствуйте. В общем нужно произвести чтение из файла и определить является ли прочитанное числом...

Считать из файла в массив char
Имеется массив char, в который из файла нужно считать строку. Для считывания использую данную...

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

По второму затруднению: scanf кушает все пробелы, табы и переводы строки перед первым считываемым значением (если не это "%c"). Может, в этом дело.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 17:08  [ТС] 3
~OhMyGodSoLong~, спасибо. Но по какой-то причине это вызывает stack around тоже..
А вот насчет второго, я знал, что он так делает, но почему кушает каретку после чтения числа - вопрос.. :<
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
20.10.2012, 17:15 4
%d по идее ожидает 4-байтового хранилища, а ты даешь char, который лишь 1 байт.
0
187 / 180 / 25
Регистрация: 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
5499 / 4894 / 831
Регистрация: 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
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
20.10.2012, 21:27 7
Ну я даже не знаю. Раз майкрософтовская scanf() не умеет модификатор hh (переполнение потому и происходит, что %hhu считается как просто %u, то есть unsigned int), то безопасный вариант только один — вон тот с интом (плюс проверка границ).

Применяйте своё право разработчика сказать "эта фича нереализуема в данных условиях" что ли.
1
187 / 180 / 25
Регистрация: 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
5499 / 4894 / 831
Регистрация: 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
187 / 180 / 25
Регистрация: 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
5499 / 4894 / 831
Регистрация: 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
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 10:39  [ТС] 12
alsav22, я говорю, что в моём случае "код в посте 9" не выводит ничего, пока я не введу ещё один символ, который и будет выведен.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 10:52 13
Тогда не пойму о чём разговор. Зачем писать, что '\n' куда-то исчезает, что getchar() его не видит? Вы хотите его поймать, через scanf() ?

Добавлено через 2 минуты
Цитата Сообщение от nexen Посмотреть сообщение
alsav22, я говорю, что в моём случае "код в посте 9" не выводит ничего, пока я не введу ещё один символ
Что значит "ещё один"? Вводится только одно число. scanf() его читает, '\n' остаётся в потоке, getchar() извлекает его и помещает в someChar. На экран выводится 10.
1
187 / 180 / 25
Регистрация: 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:12 15
Цитата Сообщение от nexen Посмотреть сообщение
Я лишь ввожу сам новый символ
Не знаю, как у вас, (какая среда?), но у меня ничего вводить не нужно. getchar() автоматом извлекает '\n' (так же, как и cin.get()) и код идёт дальше. Никакого ожидания, для второго ввода нет ( у меня, по крайней мере).
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 11:14  [ТС] 16
VS 2008
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:19 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(); // здесь будет ждать ввода
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 11:32  [ТС] 18
alsav22, да вы шутите, сударь, я уже 3 раза показывал и расписывал, как определяю, что что-то осталось!
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.10.2012, 11:43 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);
, то у вас, что выводится на экран?
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
21.10.2012, 12:12  [ТС] 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' нет и не было в помине и ничего его не поймает.
В первом случае просит дважды ввести символ.
Во втором случае просит дважды ввести символ.
0
21.10.2012, 12:12
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2012, 12:12
Помогаю со студенческими работами здесь

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

Как считать строку из файла в char?
Всем привет! Считать строку из файла в string - не проблема. Функцию getline() и погнали. Но мне...

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

Считать с файла строку типа char до знака окончания строки
Всем доброго времени суток. Мне нужно считать с файла строку типа char до знака окончания строки (...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru