Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Я хочу запретить ввод букв. Как это сделать? (http://forum.oszone.net/showthread.php?t=108817)

DENoszone 09-06-2008 21:33 822542

Я хочу запретить ввод букв. Как это сделать?
 
Я хочу запретить ввод букв. Как это сделать?
гетч не предлагать хочется без гетча =)

Drongo 10-06-2008 00:36 822658

DENoszone,
Цитата:

Цитата 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; // не цифра
}


Admiral 10-06-2008 00:51 822666

Drongo, автор ищет альтернативу обычной консольной функции getch().
DENoszone, в почему бы не дать юзеру ввести всё символы, что он желает, а потом выбрать из этой строчки только цифры?

Busla 10-06-2008 10:54 822821

imho на чистом си (переносимом) изобразить не получится - надо привязываться к платформе - использовать winapi или прерывание dos.

DENoszone 10-06-2008 21:10 823243

Admiral, эээ как???
ну это и есть то что я хочу...только если там имеются буквы то сказать досвидания и введите заново.
как осуществить?

Admiral 11-06-2008 03:43 823383

Хотя бы так
Код:

#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 823439

оно закрывается..а как на повтор запросить?

Admiral 11-06-2008 12:56 823615

Теперь ясно, что требовалось: названия темы предусматривает на любой введённый символ, если он не цифра, не реагировать, даже не отображать. Сам не задавался такой целью, но скорей всего это реализуется средствами платформы, как указал Busla.
Что б сделать повторы можно, например использовать цикл: while или repeat. Из этих двух предложенных repeat будет более логично, перевод же "повторить", всё же оно должно хотя бы раз спросить.

DENoszone 11-06-2008 22:04 824036

не понял как

Drongo 11-06-2008 23:22 824109

Admiral,
Цитата:

Цитата Admiral
Из этих двух предложенных repeat будет более логично »

А вы не скажете это разве управляющая структура из С++ ?!

Admiral 12-06-2008 03:52 824233

DENoszone, с циклами знакомство есть?
Вот почитать на досуге А. Нейбауэр. Моя первая программа на C/C++ ГЛАВА 9 ЦИКЛЫ, подтянуть матчасть.

Drongo, нет это не из С/С++ :blush: , верное замечание :up. Я про Cишную do ... while, обозвал её Pascalевской repeat.
А почему этого не заметил автор топика?
Автор публикации прибегает к этой ассоциации и вводит переменную repeat к циклу for.
Я когда писал предыдущий пост, мысленно был далеко от С, но близко к циклам и к ассоциативному repeat.

DENoszone 12-06-2008 08:57 824270

знаком с циклами...вот попробуйте кто то сдеклать..у меня тупо вылетает...зависает и все такое..

Admiral 13-06-2008 02:10 824864

Вот и отлично, тогда не составит большого труда перенести этот код на циклы. :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, когда попадаем на ситуацию с вводом не чисел.
В указанной мной выше по теме ссылке это объясняется, а в этой главе более детально рассмотрено.

DENoszone 13-06-2008 09:15 824929

visual studio 5
ок спасибо попробую

DENoszone 13-06-2008 20:14 825337

спасибо действует...долго пытался понять что такое stdin ...это какой то файл буфера обмена?

Admiral 13-06-2008 20:21 825342

Да, можно и так сказать. Дословный перевод "потоко приёмник".
Вот больше информации stdin, stdout, stderr (Англ.),
относится и к компилятору С входящему в visual studio 5.

DENoszone 13-06-2008 20:23 825343

о кстати...раз я уже тут...хочу чтоб ы русские буквы отображал..

Admiral 13-06-2008 21:17 825384

:off:
Такой вопрос уже рассматривали в нескольких темах.
...проблемы в консоле с русским
Из среде тоже варианты доступны - расписаны здесь Русские символы в Visual С++ , возможно и в Visual Studio 5 такое есть.
Ещё пару вариантов, с повторами, здесь Как сделать так,чтобы проги на С++ понимали русский язык?
А здесь даже пример набрали Русские текст в консольных приложениях C++
Если возникнут сложности, по этому вопросу, то тогда стоит отписаться в одной из этих тем, в зависимости от выбранного способа, ибо это уже :off:

DENoszone 13-06-2008 22:37 825432

на счет ввода...ещё желательно что бы пробелы тоже считало как за символы.
можете это дописать?

Admiral 13-06-2008 23:03 825457

Пробелом разделяется ввод переменных в scanf. Разве отказаться от использования scanf.
Если нужно ввести два или несколько чисел, я так понимаю для этого пробел требуется, тогд: или организовать цикл с вводом в scanf, или захват сразу несколько переменных одним scanf:
scanf("%d %d %d...",&a,&b,&c,...)
Исходя из поставленной темы, ещё вопрос что больше усложнит прогу и нагрузит пользователя: ввод через цикл по одному числу, с бранью на каждом этапе ввода если вводит символы , или несколько переменных в одну строчку, с бранью если хоть одна из переменных окажется не числом.

DENoszone 13-06-2008 23:07 825460

я не понял полет мысли=))
у меня два поля для ввода и они желательно должны быть отдельными.
елси в первое введет "10 пробел 20" - то 20 запишется во второе значение. а это не желательно..
ну хотя если это и делается то что бы человек понимал что уже ввел значения и во второе..хотя это мне не надо точно=)

Admiral 14-06-2008 03:23 825593

Тогда будем писать два раза scanf, теперь я не понял зачем тогда пробел?
Теперь становится понятно, тогда так и стоит сделать:
Код:

printf("\n Введите первый параметр (Только числа) ")
/* Здесь соответственная проверка на вводе именно чисел.*/
printf("\n Введите второй параметр (Только числа) ")
/* Дубль или организовать возврат на проверку.*/

или действительно растолковать юзеру что через пробел необходимо вводить лишь числа.
Код:

printf("\n Введите <x>пробел<y> (Только числа) ")
/* А здесь уже проверка на ввод обоих значений, если одно введено не верно то попросят заново ввести оба.*/


DENoszone 14-06-2008 08:34 825634

а где проверка???
что бы пробел считался как буква...
к примеру
"%dрпарапр%d" - записывается только первое %d
"%dпробел %d" - только первое %d

Admiral 14-06-2008 10:55 825686

DENoszone, в текущем состоянии, когда в scanf указанна одна переменная, он так и работает, как показано в предыдущем посте, вот результат
Код:

Hi! Please enter the NUMBERS only 234234sdf 54645645fghfg

 Thanks! You enter number 234234

Если пробел первый, но после него цифра он читает её. А на простое нажимание пробела идёт не восприятие.

DENoszone 14-06-2008 10:55 825687

блин=((
вообщем пытался сделать что то с русскими буквами...
но окозывается у меня уже все работало на компе...
но я что то зменил и после перезагрузки у меня в коде все переписалось на "‘Ї*бЁЎ®. ‚л ўўҐ«Ё"
а в программе это выходит норм русскими буквами...но если я напишу в коде русские буквы меня послыют. =)

XPEHOMETP 15-06-2008 00:01 826277

Фишка в том, что при выводе на консоль используется ДОСовская кодировка (ОЕМ), а в виндовских программах - ANSI (от юникода на время абстрагируемся для простоты). Кодировочки эти совпадают для цифр и английских букв, но отнюдь не для русских. Отсюда и траблы. Решить можно, загоняя введенный русский текст в функцию CharToOem (cмотрим здесь и здесь)

Admiral 15-06-2008 00:45 826290

XPEHOMETP, да в тех темах ещё юникод не так юзали, как сейчас во многих прогах.
CharToOem привязывает к MSVS. По универсальнее на базе ANSI, по моему это использовать набор текста в редакторе с соответствующей кодировкой.
А есть где простенький пример с юникодом, так сказать после заканчивания абстракции?

XPEHOMETP 15-06-2008 21:54 826793

Про юникод не знаю, мне это как-то не нужно было. Тем более что я на работе по большей части под Win 98SE сижу. Кажись, прямого преобразования из Unicode в ОЕМ нету, придется делать в два этапа: UnicodeToAnsi + CharToOem


Время: 02:08.

Время: 02:08.
© OSzone.net 2001-