Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Функция ввода текста с выводом на экран и запись в буфер (язык C)

37K
13 ноября 2010 года
Tolias28
48 / / 20.09.2010
Задача: Написать функцию, которая в консольном окне в текстовом режиме позволяет сделать ввод текста, который является числами, определенной длины в определенном месте экрана. При этом нужно корректно обрабатывать спецклавиши. А именно:
1. При нажатии Escape: ничего в буфер не записывать и на экран не выводить, а просто выходить из функции.
2. При нажатии Enter: прекращать ввод текста и функция должна возвращать введенное число. Также проверять, если пользователь еще ничего не ввел, а уже нажал Enter, то ничего не делать, а продолжать ждать, пока он не введет какое-то число.
3. При нажатии стрелок вправо\влево на экране перемещать курсор соответственно. И чтобы после этого набор текста мог осуществляться с того места, где стоит курсор, и если справа от курсора находится текст, то нужно его сдвигать на экране(так как это работает в любом текстовом редакторе).
4. При нажатии любых символов, отличных от приведенных выше, а также отличных от цифр, просто ничего не делать, а ждать, когда пользователь введет числа.

Все эти пункты я уже сделал и написал, прога работает. Не сделал я только пункт 3... моск уже кипит... чтобы осуществлять ввод текста с возможностью его ввода с любого места строки, где стоит курсор - не могу ничего толкового на счет этот придумать. Помогите пожалуйста. Наперед говорю огромное спасибо!:)

P.S. Вот мой код, где пункты 1,2,4 уже работают:
Код:
int EnterTextInt(int x,int y,int lim) //x,y - координаты начала поля, lim - размер поля ввода.
           {
              //int x,y,i,lim,var_int;
              int i,var_int;
              char *str;
              str=(char*)calloc(lim,sizeof(char));
              if(str==NULL) MemoryErrorMes();
              x=48;
              y=4;
              lim=2; //максимальный размер поля ввода
              gotoxy(x,y);
              for(i=0;str!=13;i++)
              {

                 str=getch();
                 if((str==8)&(i>0)) { //если был нажат Backspace и строка с больше, чем одного символа
                    x=wherex(); y=wherey();
                    gotoxy(x-1,y); //курсор перемещается влево на одну позицию
                    cprintf(" "); //затирается на экране последний символ строки
                    gotoxy(x-1,y); //курсор перемещается влево на одну позицию
                    str[i-1]='\0'; //затирается в массиве последний символ строки
                    i-=2; //чтобы при следующем входе в цикл запись символа в строку осуществлялась с места, где был последний символ
                    continue; //возвращение в начало цикла
                 }else if((str<48)||(str>57)) { //если были введены не цифры
                          if(str==27){ //если был введен Escape, то выходим из цикла
                                break;
                          }else if(str==13){ //если был введен Enter
                                   if(i!=0){ //проверяем, чтобы строка содержала хотя бы один символ
                                      str='\0'; //ставим символ конца строки
                                      break; //обрываем цикл
                                   }else{ //если не было введено в строку никаких символов, то нужно вернуться в начало цикла с помощью continue, чтобы предоставить возможность снова ввести строку
                                       i--; //для этого восстановляем итератор цикла в нуль
                                       str[0]=1; //и присваиваем str[0] значение, отличное от 13, чтобы осуществился вход в цикл после continue
                                       //printf("{%c}",str);
                                       continue; //и возвращаемся в начало цикла
                                    }
                                }else{ //если был введен любой другой символ, отличный от приведенных выше, то тоже возвращаемся в начало цикла
                                    i--; //для этого восстановляем итератор цикла в нуль
                                    continue;  //и возвращаемся в начало цикла
                                 } //end if 27 13
                       } //end if 48 57
                 if(i>lim-1){ //если строка выходит за границы поля (текущий введеный символ за границей поля)
                     i--; //то даем возможность ввести еще раз последний символ в строке
                     x=wherex(); //узнаем текущую координату курсора X
                     gotoxy(x-1,y); //на экране возвращаем то место, где быдет появляться символ, назад на одну позицию влево(чтобы текст не выходил за границы поля)
                  }
                  cprintf("%c",str); //если строка НЕ выходит за границы поля, то выводим введенный символ на экран
              } // end for(i=0;str!=13;i++)
              if(i){ //если строка содержит хотя бы один символ
                 var_int=atoi(str); //то конвертируем строку в целое число
              }
                 return var_int; //функция возвращает полученное число
           }
37K
21 ноября 2010 года
Tolias28
48 / / 20.09.2010
да..м..спасибо форумчанам за активное участие и огромную помощь:p

На другом форуме мне быстрее помогли... Вот эта функция:
Код:
int InputCharInt(const char *label, char *str, int lim)
{
    //hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    //char *str=(char*)calloc(lim+1,sizeof(char));
    for(int i=0;i<=lim;i++) str='\0';
    int charCount=0,x,y;
    x=wherex(); y=wherey();

    str[0]=0;str[5]=0;
    int key=0,tmp=0,tmp2=0;

    for(int i=0;key!=13;i++)
    {
        key=getch();

        if(key>=48 && key<=57)
        {
            if(charCount>lim-1)
            {
                i--;continue;
            }
            tmp=str;
            for(int j=i;j<lim-1;j++)
            {
                tmp2=str[j+1];
                str[j+1]=tmp;
                tmp=tmp2;
            }
            str=key;
            charCount++;

            gotoxy(x,y);
            cprintf("%s",str);
            gotoxy(x+i+1,y);

            continue;
        }

        if(key==8)
        {
            if(wherex()==x)
            {
                i--;continue;
            }
            gotoxy(x+charCount-1,y);
            cprintf(" ");      
            gotoxy(wherex()-1,wherey());

            tmp=str[charCount-1];
            for(int j=charCount-1;j!=i-1;j--)
            {
                tmp2=str[j-1];
                str[j-1]=tmp;
                tmp=tmp2;
            }
            charCount--;
            str[charCount]=0;
            gotoxy(x,y);
            cprintf("%s",str);
            gotoxy(x+i-1,y);
           
            i-=2;
            continue;
        }

        if (key==13)
        {
            if(!i)
            {
                key=0;
                i--;
                continue;
            }
            str[charCount]=0;
            break;
        }

        if(key==27) return 27;

        if(key==0xE0)
        {
            i--;
            continue;              
        }
    if(key==0){
        key=getch();
        if(key==75)
        {
            if(wherex()==x)
            {
                i--;continue;
            }
            gotoxy(wherex()-1,wherey());
            i-=2;
            continue;
        }

        if(key==77)
        {
            if(wherex()==lim+5 || charCount==i)
            {
                i--;
                continue;
            }
            gotoxy(wherex()+1,wherey());
            continue;
        }
    }
        i--;continue;
    }
    //return *str;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог