Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
1

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

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

Доброго времени суток. Есть такой вопрос. Как мне закончить ввод при нажатии esc. Например, если пользователь вводит некий текст (через cin например) и нажимает enter, то ввод заканчивается и этот текст идет дальше по функции, но если он нажал esc, то должен произойти выход из этой функции.
Надеюсь мысль ясна, заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2013, 02:07
Ответы с готовыми решениями:

Как определить символ конца строки
Всем доброго времени суток! Работаю в VS2012 Такая задача - работаю со строками. Считываю файл...

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

Окончание ввода с клавиатуры по Esc. Как исхитриться?
В программе просто убийственное количество строк вида scanf("%f",var);Как результат - невозможно...

как узнать символ конца строки
s:='abcde'; var s:ansistrind c:ansichar asm mov eax, (s) mov al, (eax+5) mov c, al

9
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
06.05.2013, 02:30 2
несовсем ясна, выход из вашей функции или из cin<< всё же нужно осуществить?
из cin - никак, это канонический ввод в терминал, смотрите в сторону методов get либо если не устроят (всё зависит от конкретного случая) - придётся копать в сторону 1) неканоничного ввода, 2) библиотеки ncurses, 3) отрыву от стандарта и привязки к win-платформе через conio.h и подобной фигне
но это если я правильно понял вашу проблему
1
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 02:33  [ТС] 3
Цитата Сообщение от abit Посмотреть сообщение
несовсем ясна, выход из вашей функции или из cin<<?
из cin - никак, это канонический ввод в терминал, смотрите в сторону методов get либо если не устроят (всё зависит от конкретного случая) - придётся копать в сторону 1) неканоничного ввода, 2) библиотеки ncurses, 3) отрыву от стандарта и привязки к win-платформе через conio.h и подобной фигне
но это если я правильно понял вашу проблему )
Выход из моей функции. Я не против использования того же getline, просто не знаю как сделать, что бы после нажатия на esc или enter ввод заканчивался. Там уже можно будет проверить последний символ в строке, и если он не '\n', то выход из функции.
0
20 / 20 / 8
Регистрация: 02.10.2012
Сообщений: 124
06.05.2013, 02:34 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;
}
в теле уже код свой напишешь
0
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
06.05.2013, 02:52 5
эм, нет... getline ждёт строки с '\n'
я имел в виду это - http://www.cplusplus.com/refer... tream/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++ конечно так делать нельзя
1
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 03:04  [ТС] 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;
}
0
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
06.05.2013, 03:05 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;
}
1
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 03:08  [ТС] 8
Вот такой винегрет получился. Теперь мы узнаем нажата была esc или не esc. Надо еще backspace приделать сюда.

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

Добавлено через 51 секунду
Такая же солянка как и у меня, но работает =)
0
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
06.05.2013, 03:08 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;
и всё сами поймёте
1
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
06.05.2013, 03:12  [ТС] 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;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2013, 03:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как удалить символ конца строки?
у меня в программе &quot;Словарь&quot; при выводе перевода слова в конец вставляется 0(как показано на...

Как ввести признак конца ввода?
Есть такая задача В строку через пробел вводятся числа до тех пор, пока не введется признак конца...

Как в консоле набрать символ конца строки?
Изучаю в Perl работу с массивами и чтобы завершить ввод в массив надо ввести сивол конца файлаО_о.

Scanf считывает enter, как символ конца строки. Как исправить?
Добрый день. Пишу меню для программы в Visual Studio 2015, возникает проблема: scanf запоминает...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.