187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

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

20.10.2012, 16:26. Показов 5318. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2012, 16:26
Ответы с готовыми решениями:

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

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

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

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

20
~ Эврика! ~
1256 / 1005 / 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
527 / 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
5488 / 4883 / 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
~ Эврика! ~
1256 / 1005 / 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
5488 / 4883 / 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
5488 / 4883 / 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
5488 / 4883 / 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
5488 / 4883 / 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
5488 / 4883 / 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
5488 / 4883 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2012, 12:12
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru