Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Исключить ввод "букв" в консоль


Автор: Alix36 11.9.2009, 16:04
Какими способами можно ограничить ввод символов букв в программу.
Код

float count2,result;
void main (void)                    
{
setlocale(LC_ALL, "Russian");
        cin>>count2;
    if(int(count2)==count2 && count2>0)
    {
        cout <<"Результат:" << exeFunc(count2);
    }else{
        cout <<"Результат: Введены некорректные параметры.";
    }
}

теми проверками что есть, ограничиваем исполнение при отрицательном или не целом числе.....
Из идей:
1) Проверять коды вводимых символов через getch().  Не вышло. Если начинаем ввод(cin) проверка уже не работает... что логично... 
2) "стирать" все не цифры, при попытке ввода.  Не могу придумать алгоритм... smile 
3) проверять при вводе(isdigit)  Функция всегда возвращает 0, независимо от того что ввели....

Автор: Anikmar 11.9.2009, 16:52
Цитата(Alix36 @  11.9.2009,  16:04 Найти цитируемый пост)
Проверять коды вводимых символов через getch().  

Самое простое именно так.

Автор: Alix36 11.9.2009, 16:56
а как тогда? пример в студию...
Самое простое оказалось под носом.
переменная то float....
Все буквы и буквенные выражения =0.0000

Автор: Anikmar 11.9.2009, 17:17
Цитата(Alix36 @  11.9.2009,  16:56 Найти цитируемый пост)
пример в студию...

А где щелчок пальцами? "Официант! Кальмаров и пример в студию!"  smile 

как-то так:
Код

char Cur;
char Buff[10];
int i=0;
do{
  Cur = getch();
  if ((Cur >= '0')&&(Cur <='9')||(Cur == '.'))
  {
      putch(Cur);
      Buff[i++] = Cur;
   }
  if (i==9) break;
}while(Cur != '\n');
Buff[i] = 0;



Это так - набросок. 

Автор: bsa 11.9.2009, 19:12
У тебя ошибка в самом начале программы - функция main() определена неверно:
Код
void main (void)
Должно быть так:
Код
int main()
или так:
Код
int main(int argc, char *argv[])

Хочу обратить внимание, что функция getch() не входит ни в один стандарт. Поэтому собираться программа с ее использованием будет далеко не на всех платформах.

Автор: Anikmar 11.9.2009, 19:34
Цитата(bsa @  11.9.2009,  19:12 Найти цитируемый пост)
Хочу обратить внимание, что функция getch() не входит ни в один стандарт. Поэтому собираться программа с ее использованием будет далеко не на всех платформах. 


Честно говоря не встречал компилятора, в котором нет conio.h, но соглашусь, что можно использовать что-нибудь аналогичное (например из stdio.h типа getc/putc), которое включено в стандарт. Суть не меняется. Не думаю, что данный код претендует на гениальность и повсеместное применение.  smile

На самом деле я так редко пользуюсь этими функциями, что уже все позабывал - что там есть, чего нет.  smile 

Автор: bsa 11.9.2009, 20:06
Anikmar, getc работает только после ввода всей строки (т.е. после нажатия клавиши Enter). Это означает, что пользователь может ввести левые символы, а ты с этим поделать ничего не сможешь. Имхо, проще считать просто строку, проверить на допустимые символы, если есть недопустимые - потребовать повторного ввода.

Автор: Anikmar 11.9.2009, 21:24
Цитата(bsa @  11.9.2009,  20:06 Найти цитируемый пост)
getc работает только после ввода всей строки 

Да я же просто навскидку пример привел  smile 
Цитата(bsa @  11.9.2009,  20:06 Найти цитируемый пост)
Имхо, проще считать просто строку, проверить на допустимые символы, если есть недопустимые - потребовать повторного ввода. 

Там предел фантазий неограничен, но так некрасиво. Прикольнее просто запретить вводить по ходу пьесы, а заодно топикстартер может потренироваться на строках типа
--0.998.000 или -56.89+9 и т.п.  smile 

Автор: Alix36 12.9.2009, 11:45
1) void main(void) ничем не хуже int main(void)
программа не работает с внешними праметрами. И зачем ей что-то возвращать? 
2) платформа у меня определенная, программа узконаправленная smile conio подходит... 
Anikmar, Пожалуйста, Спасибо!!! 

"Имхо, проще считать просто строку, проверить на допустимые символы, если есть недопустимые - потребовать повторного ввода. "
ну... если строку оставить float, тогда все "нехорошие символы" будут нулями, и как их тогдаотличать от действительных нулей?.
 если вводить в char, то в итоге получаем тот-же цикл.

Автор: Kanes 12.9.2009, 15:48
Цитата(Alix36 @  12.9.2009,  11:45 Найти цитируемый пост)
void main(void) ничем не хуже int main(void)
программа не работает с внешними праметрами. И зачем ей что-то возвращать? 

Коллега, не путайте Си и С++, в стандрате С++ строго оговорено что функция main() может иметь только два вида, которые привел bsa.

Автор: Alix36 12.9.2009, 20:27
хм... честно говоря не читал саму документацию... в книгах были и такие и такие конструкции.
По факту работает и то и то. но все таки буду знать.
вот переделанный рабочий код smile спасибо всем smile
Код

char Cur;
char Buff[20];
int i=0;
while(i<20)
{
    Cur = getch();
  if(Cur==13) break;
  if ((Cur >= '0')&&(Cur <='9'))
  {
      putch(Cur);
      Buff[i++] = Cur;
   }
  if (i==19) break;
}
Buff[i] = 0;
cout << Buff;

do-while не верно работает ибо прерывание по пробелу происходит после того как i может превысить лимит массива, соответственно теряем нулевой.

Либо можно просто  добавить if(Cur==13) break;, но 2 проверки на пробел не круто.

Автор: Anikmar 12.9.2009, 20:57
Цитата(Alix36 @  12.9.2009,  20:27 Найти цитируемый пост)
while(i<20)


Цитата(Alix36 @  12.9.2009,  20:27 Найти цитируемый пост)
if (i==19) break;


Как-то запутано тут все у вас. Главное условие цикла никогда не сработает. Можно смело писать while(true)

Автор: Alix36 13.9.2009, 21:25
а разве 19 не меньше 20 ? на последнем и срабатывает.

Я решил еще подумать....!

и сделал без массива... но чую сделал лишний switch, подскажите, можно ли от него избавиться?
Код

while(1>0)
{
    Cur = getch();
    if(Cur==13) break;
// если Ентер
    if ((Cur >= '0')&&(Cur <='9'))
    {
        switch(Cur){
            case 48: Cur=0;break;
            case 49: Cur=1;break;
            case 50: Cur=2;break;
            case 51: Cur=3;break;
            case 52: Cur=4;break;
            case 53: Cur=5;break;
            case 54: Cur=6;break;
            case 55: Cur=7;break;
            case 56: Cur=8;break;
            case 57: Cur=9;break;

        }
        cout << Cur;
// выводим выбранный символ.
        count=count*10+Cur;
// преобразуем символы с клв. в единое число :)
    }
}

Автор: Anikmar 13.9.2009, 21:34
Цитата(Alix36 @  13.9.2009,  21:25 Найти цитируемый пост)
    if ((Cur >= '0')&&(Cur <='9'))
    {
        switch(Cur){
            case 48: Cur=0;break;
            case 49: Cur=1;break;
            case 50: Cur=2;break;
            case 51: Cur=3;break;
            case 52: Cur=4;break;
            case 53: Cur=5;break;
            case 54: Cur=6;break;
            case 55: Cur=7;break;
            case 56: Cur=8;break;
            case 57: Cur=9;break;

        }

Можно ли избавиться? Вы сами внимательно посмотрите на то, что написали.
Может проще так:
Cur-=48;
Вот и избавились.

Автор: Alix36 13.9.2009, 21:36
ну я же говорю что я лишнее что-то сделал ))

Автор: Anikmar 13.9.2009, 22:21
С таким способом преобразования мне не понятно как вы будете десятичную точку обрабатывать.
Целые числа - прокатят, а дробные?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)