Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
#1

Esc как символ конца ввода - C++

06.05.2013, 02:07. Просмотров 1697. Ответов 9
Метки нет (Все метки)

Доброго времени суток. Есть такой вопрос. Как мне закончить ввод при нажатии esc. Например, если пользователь вводит некий текст (через cin например) и нажимает enter, то ввод заканчивается и этот текст идет дальше по функции, но если он нажал esc, то должен произойти выход из этой функции.
Надеюсь мысль ясна, заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.05.2013, 02:30     Esc как символ конца ввода #2
несовсем ясна, выход из вашей функции или из cin<< всё же нужно осуществить?
из cin - никак, это канонический ввод в терминал, смотрите в сторону методов get либо если не устроят (всё зависит от конкретного случая) - придётся копать в сторону 1) неканоничного ввода, 2) библиотеки ncurses, 3) отрыву от стандарта и привязки к win-платформе через conio.h и подобной фигне
но это если я правильно понял вашу проблему
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 02:33  [ТС]     Esc как символ конца ввода #3
Цитата Сообщение от abit Посмотреть сообщение
несовсем ясна, выход из вашей функции или из cin<<?
из cin - никак, это канонический ввод в терминал, смотрите в сторону методов get либо если не устроят (всё зависит от конкретного случая) - придётся копать в сторону 1) неканоничного ввода, 2) библиотеки ncurses, 3) отрыву от стандарта и привязки к win-платформе через conio.h и подобной фигне
но это если я правильно понял вашу проблему )
Выход из моей функции. Я не против использования того же getline, просто не знаю как сделать, что бы после нажатия на esc или enter ввод заканчивался. Там уже можно будет проверить последний символ в строке, и если он не '\n', то выход из функции.
Last_Night
19 / 19 / 0
Регистрация: 02.10.2012
Сообщений: 124
06.05.2013, 02:34     Esc как символ конца ввода #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
 
int main() {
    clrscr();
    char ch;
    while (ch != 27) {
        ch = getch();
        cout<<(int)ch;
    }
    return 0;
}
в теле уже код свой напишешь
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.05.2013, 02:52     Esc как символ конца ввода #5
эм, нет... getline ждёт строки с '\n'
я имел в виду это - http://www.cplusplus.com/reference/istream/istream/get/

она получает очередной символ с входного потока, а дальше вы обрабатываете его как хотите, но Esc она не поймает

дело в том, что у меня винды нет сейчас под рукой, написал вам пример как по Esc прекратить ввод строки на win-базед платформе, поглядите, это не то что вам нужно? (только предупреждаю это не по стандарту и возможны ошибки, т.к. проверил только под эмулятором wine)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <conio.h>
 
using namespace std;
 
 
int main() 
{
 
    char c;
    string s;
    c = getch(); 
    while ((c!=13)&&(c!=27))
    {
          cout<<c;
          s+=c;
          c = getch();
    }
    cout<<endl;
    cout<<"you input - "<<s<<endl;
    system("pause");
    return 0;
}
но в стандарте C++ конечно так делать нельзя
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 03:04  [ТС]     Esc как символ конца ввода #6
Last_Night, так не пойдет. Надо, чтобы пользователь во время ввода строки мог нажать esc и завершить ввод, а здесь просто посимвольный ввод. Были мысли, чтобы так сделать, то есть чтобы пользователь вводил по одному символу и каждый символ проверялся на соответствие, но тогда нельзя (а точнее затруднительно) было бы реализовать функцию клавиши backspace.

Добавлено через 1 минуту
abit, вроде бы все хорошо, но нужен backspace =)

Добавлено через 6 минут
И надо, чтобы выход по нажатию esc мы могли как-то отличить от enter.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
#include <conio.h>
 
using namespace std;
 
 
int main() 
{
 
    char c;
    string s;
    c = getch(); 
    while ((c!=13)&&(c!=27))
    {
          cout<<c;
          s+=c;
          c = getch();
          if (c==8){cout<<"\b";};
    }
    cout<<endl;
    string res;
    res.resize(1);
    if (c==13){s=s+"\n";};
    copy(s.end()-1,s.end(),res.begin());
    if(res!="\n"){return 0;};
    cout<<"you input - "<<s<<endl;
    return 0;
}
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.05.2013, 03:05     Esc как символ конца ввода #7
art3330, он там физически как бы есть, но при этом не отображается его результат... сейчас помозговал - вроду бы так
но это такой костыль, что самому смешно было пока писал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>
#include <conio.h>
 
using namespace std;
 
 
int main() 
{
 
    char c;
    string s;
    c = getch(); 
    while ((c!=13)&&(c!=27))
    {
          if (c!=8)
          s+=c;
          else s.erase(--s.end(),s.end());
          system("cls");
          cout<<s;
          c = getch();
    }
    cout<<endl;
    cout<<"you input - "<<s;
    system("pause");
    return 0;
}
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 03:08  [ТС]     Esc как символ конца ввода #8
Вот такой винегрет получился. Теперь мы узнаем нажата была esc или не esc. Надо еще backspace приделать сюда.

Добавлено через 39 секунд
abit, великолепно! =)

Добавлено через 51 секунду
Такая же солянка как и у меня, но работает =)
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.05.2013, 03:08     Esc как символ конца ввода #9
отличить легко, вместо строчки
C++
1
cout<<"you input - "<<s;
напишите
C++
1
2
3
    cout<<"you input - "<<s<<endl;
    if (c==13) cout<<"Enter"<<endl;
    else if (c==27) cout<<"Esc"<<endl;
и всё сами поймёте
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 03:12     Esc как символ конца ввода
Еще ссылки по теме:

символ конца файла C++
Разработать алгоритм и программу для разбиения текста на строки (как признак конца строки в тексте использовать символ @) C++
C++ Символ конца массива char
C++ Как определить символ конца строки
Определить символ конца строки в TextBox C++

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

Или воспользуйтесь поиском по форуму:
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 03:12  [ТС]     Esc как символ конца ввода #10
Вот же точно. А я накрутил =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
using namespace std;
 
 
int main() 
{
 
    char c;
    string s;
    c = getch(); 
    while (c!=13){  
        if (c!=8){s+=c;}
        else {s.erase(--s.end(),s.end());};
        system("cls");
        cout<<s;
        c = getch();
        if(c==27){return 0;};
    }
    cout<<endl;
    cout<<"you input - "<<s<<endl;
    return 0;
}
Yandex
Объявления
06.05.2013, 03:12     Esc как символ конца ввода
Ответ Создать тему
Опции темы

Текущее время: 04:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru