Показать полную графическую версию : Я хочу запретить ввод букв. Как это сделать?
DENoszone
09-06-2008, 21:33
Я хочу запретить ввод букв. Как это сделать?
гетч не предлагать хочется без гетча =)
DENoszone, Я хочу запретить ввод букв. Как это сделать? »Куда запретить? Если компонет Edit в Borland C++ Builder то лучше использовать MaskEdit
Вопрос бедный, для каких целей? Где это нужно?
// Функция ввода, проверяет ввод только цифр А >= 0 или А <= 0, в Edit
void __fastcall TForm1::EditKeyPressPositivNumber(TObject *Sender, char &Key)
{
if ((Key >= '0') && (Key <= '9') || Key == VK_BACK) {} // цифры
else if ((Key == '.') || (Key == ',')) // запятая
else
Key = 0; // не цифра
}
Drongo, автор ищет альтернативу обычной консольной функции getch().
DENoszone, в почему бы не дать юзеру ввести всё символы, что он желает, а потом выбрать из этой строчки только цифры?
imho на чистом си (переносимом) изобразить не получится - надо привязываться к платформе - использовать winapi или прерывание dos.
DENoszone
10-06-2008, 21:10
Admiral, эээ как???
ну это и есть то что я хочу...только если там имеются буквы то сказать досвидания и введите заново.
как осуществить?
Хотя бы так
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
printf("\nHi! Please enter the NUMBERS only ");
if ((scanf("%d",&i))!=0)
{
printf("\n Thanks! You enter number %d",i);
}
return 0;
}
Программа запишет первые цифры до ошибки пользователя. Тоесть набирать он может сколько угодно, но в переменную внесётся только первый символ если он был числом.
DENoszone
11-06-2008, 08:56
оно закрывается..а как на повтор запросить?
Теперь ясно, что требовалось: названия темы предусматривает на любой введённый символ, если он не цифра, не реагировать, даже не отображать. Сам не задавался такой целью, но скорей всего это реализуется средствами платформы, как указал Busla.
Что б сделать повторы можно, например использовать цикл: while или repeat. Из этих двух предложенных repeat будет более логично, перевод же "повторить", всё же оно должно хотя бы раз спросить.
DENoszone
11-06-2008, 22:04
не понял как
Admiral, Из этих двух предложенных repeat будет более логично »А вы не скажете это разве управляющая структура из С++ ?!
DENoszone, с циклами знакомство есть?
Вот почитать на досуге А. Нейбауэр. Моя первая программа на C/C++ ГЛАВА 9 ЦИКЛЫ (http://www.piter.com/lib/978588782056/c_v.phtml?fil=c_v09), подтянуть матчасть.
Drongo, нет это не из С/С++ :blush: , верное замечание :up. Я про Cишную do ... while, обозвал её Pascalевской repeat.
А почему этого не заметил автор топика?
Автор публикации (http://www.piter.com/lib/978588782056/c_v.phtml?fil=c_v09) прибегает к этой ассоциации и вводит переменную repeat к циклу for.
Я когда писал предыдущий пост, мысленно был далеко от С, но близко к циклам и к ассоциативному repeat.
DENoszone
12-06-2008, 08:57
знаком с циклами...вот попробуйте кто то сдеклать..у меня тупо вылетает...зависает и все такое..
Вот и отлично, тогда не составит большого труда перенести этот код на циклы. :wink:
Для кода, представленного в 6м посту нужно внести следующие изменение.
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
StartAgaine:
printf("\nHi! Please enter the NUMBERS only ");
if ((scanf("%d",&i))!=0)
{
printf("\n Thanks! You enter number %d",i);
return 0;
}
else
{
fflush(stdin);/*пояснения ниже по посту*/
goto StartAgaine;
}
}
Теперь-то прога не отстанет, пока юзер хоть бы раз не введёт цифру первой в строчке.
Указанные вылеты - это проблемы компилятора: значения после ввода всё ещё остаётся в буфере. И соответственно у пользователя никто не будет ничего спрашивать. Всё это будет выглядеть как повисшие приложение, которое надоесть ОС и она предложить, или самостоятельно прибьёт его.
Тут два варианта или сменить компилятор, который до сих пор не озвучен в теме, или чистить буфер - fflush(stdin) после ввода в scanf, когда попадаем на ситуацию с вводом не чисел.
В указанной мной выше по теме ссылке это объясняется, а в этой главе ( http://www.piter.com/lib/978588782056/c_v.phtml?fil=c_v08) более детально рассмотрено.
DENoszone
13-06-2008, 09:15
visual studio 5
ок спасибо попробую
DENoszone
13-06-2008, 20:14
спасибо действует...долго пытался понять что такое stdin ...это какой то файл буфера обмена?
Да, можно и так сказать. Дословный перевод "потоко приёмник".
Вот больше информации stdin, stdout, stderr (http://msdn.microsoft.com/en-us/library/3x292kth(VS.80).aspx) (Англ.),
относится и к компилятору С входящему в visual studio 5.
DENoszone
13-06-2008, 20:23
о кстати...раз я уже тут...хочу чтоб ы русские буквы отображал..
:off:
Такой вопрос уже рассматривали в нескольких темах.
...проблемы в консоле с русским (http://forum.oszone.net/thread-87493.html)
Из среде тоже варианты доступны - расписаны здесь Русские символы в Visual С++ (http://forum.oszone.net/thread-44139.html), возможно и в Visual Studio 5 такое есть.
Ещё пару вариантов, с повторами, здесь Как сделать так,чтобы проги на С++ понимали русский язык? (http://forum.oszone.net/thread-30066.html)
А здесь даже пример набрали Русские текст в консольных приложениях C++ (http://forum.oszone.net/thread-30405.html)
Если возникнут сложности, по этому вопросу, то тогда стоит отписаться в одной из этих тем, в зависимости от выбранного способа, ибо это уже :off:
DENoszone
13-06-2008, 22:37
на счет ввода...ещё желательно что бы пробелы тоже считало как за символы.
можете это дописать?
Пробелом разделяется ввод переменных в scanf. Разве отказаться от использования scanf.
Если нужно ввести два или несколько чисел, я так понимаю для этого пробел требуется, тогд: или организовать цикл с вводом в scanf, или захват сразу несколько переменных одним scanf:
scanf("%d %d %d...",&a,&b,&c,...)
Исходя из поставленной темы, ещё вопрос что больше усложнит прогу и нагрузит пользователя: ввод через цикл по одному числу, с бранью на каждом этапе ввода если вводит символы , или несколько переменных в одну строчку, с бранью если хоть одна из переменных окажется не числом.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.