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

Сравнение символов в операторе if - C++

Восстановить пароль Регистрация
 
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 71
19.08.2013, 23:38     Сравнение символов в операторе if #1
Доброго времени суток!
Я новичок в c++, возникла задача: мне нужно, что бы при вводе ESC программа завершала работу. Проблемный участок кода обозначен красным.
C++
1
2
if((режим=getchar()) == "\ESC") //"режим" - это имя пременной
        exit(0);
Заранее спасибо.
P.S.
На этот раз тоже попробовал брутом - перепробовал все (почти) варианты постановки кавычек, слэшей и кодов - не помогло.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2013, 23:38     Сравнение символов в операторе if
Посмотрите здесь:

Сравнение русских символов. C++
Сравнение символов C++
Сравнение символов из строки C++
C++ Сравнение кол-ва символов рекурсией
C++ Сравнение и замена символов в строке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MickeyBlueEyes
Студент
 Аватар для MickeyBlueEyes
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
19.08.2013, 23:51     Сравнение символов в операторе if #2
C++
1
2
if((режим=getchar()) == 27) //"режим" - это имя пременной
        exit(0);
27 код escape, а сравниваете вы символ со строкой, "esc" - строка, 'a' - символ
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 71
20.08.2013, 04:13  [ТС]     Сравнение символов в операторе if #3
Спасибо за ответ, но этот вариант я уже пробовал, и программа не заработала. То есть: когда программа доходит до данного участка, я нажимая ESC, затем ENTER, но завершения работы программы не происходит. Я пробовал включить режим отладки, но я запускал его в первый раз, поэтому не знаю, как он работает. По крайней мере на всех этапах выполнения программы при наведении курсора на имя переменной выводилась следующая подсказка: unsigned short режим (я полагаю, что значение переменной не менялось, верно?)
Возможно проблема кроется именно в том, что я использую тип unsigned short, а не char, но если это так, какой тип мне нужно использовать, что бы я имел возможность работать с переменной как с числом?
dmitry94
517 / 187 / 34
Регистрация: 25.05.2012
Сообщений: 780
20.08.2013, 04:42     Сравнение символов в операторе if #4
C++
1
2
3
4
5
void main()
{
    int key;
    do key=getch(); while (key != 27);   
}
MickeyBlueEyes
Студент
 Аватар для MickeyBlueEyes
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
20.08.2013, 12:19     Сравнение символов в операторе if #5
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Спасибо за ответ, но этот вариант я уже пробовал, и программа не заработала. То есть: когда программа доходит до данного участка, я нажимая ESC, затем ENTER, но завершения работы программы не происходит. Я пробовал включить режим отладки, но я запускал его в первый раз, поэтому не знаю, как он работает. По крайней мере на всех этапах выполнения программы при наведении курсора на имя переменной выводилась следующая подсказка: unsigned short режим (я полагаю, что значение переменной не менялось, верно?)
Возможно проблема кроется именно в том, что я использую тип unsigned short, а не char, но если это так, какой тип мне нужно использовать, что бы я имел возможность работать с переменной как с числом?
Как с числом можна и с char работать, в случае с unsigned char диапазаон 0-255, а с signed char -128 - 127, символ это код, можна использовать и short и int для хранения символа, только смысла нету, если только вы не собираетесь проводить потом с ней арифметические операции которые будут иметь значение более чем 255.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, char * argv[])
{
 
    unsigned short ch;
 
    if((ch = getc(stdin)) == 27)
    {
        printf("bye\n");
    }
       
        return 0;
}
Будет работать аналогично так же как и с char ch.
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 71
20.08.2013, 14:40  [ТС]     Сравнение символов в операторе if #6
C++
1
2
3
4
5
void main()
{
    int key;
    do key=getch(); while (key != 27);   
}
Объясните, пожалуйста, поподробнее, как это работает? У меня вроде заработало, но проблема в том, что я не могу ввести в переменную другие значения, а это мне понадобится в дальнейшем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(int argc, char * argv[])
{
 
    unsigned short ch;
 
    if((ch = getc(stdin)) == 27)
    {
        printf("bye\n");
    }
       
        return 0;
}
Пробовал именно такой вариант - ни выхода не происходит, ни "bye" не печатает. В чём может быть проблема?
P.S. Пробовал разные типы переменных.
19n1ght
2 / 2 / 0
Регистрация: 13.02.2013
Сообщений: 15
21.08.2013, 01:24     Сравнение символов в операторе if #7
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Объясните, пожалуйста, поподробнее, как это работает? У меня вроде заработало, но проблема в том, что я не могу ввести в переменную другие значения, а это мне понадобится в дальнейшем.
Возможно так, с расстановкой переносов строк будет понятнее. На каждой итерации цикла нажимаем любую клавишу и ее значение, преобразованное в int (ASCII код), записывается в переменную key и выводится на экран.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <conio.h> // нужно для _getch
#define ESCAPE 27
using namespace std;
void main ()
{
    int key;
    do 
    {
        key = _getch(); // получаем (int) значение нажатой клавиши
        cout << key << endl; // выводим его на экран для проверки
    } while (key != ESCAPE); // если Escape, то выходим из цикла do while (define ESCAPE равен 27)
}
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 71
21.08.2013, 01:53  [ТС]     Сравнение символов в операторе if #8
Цитата Сообщение от 19n1ght Посмотреть сообщение
Возможно так, с расстановкой переносов строк будет понятнее. На каждой итерации цикла нажимаем любую клавишу и ее значение, преобразованное в int (ASCII код), записывается в переменную key и выводится на экран.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <conio.h> // нужно для _getch
#define ESCAPE 27
using namespace std;
void main ()
{
    int key;
    do 
    {
        key = _getch(); // получаем (int) значение нажатой клавиши
        cout << key << endl; // выводим его на экран для проверки
    } while (key != ESCAPE); // если Escape, то выходим из цикла do while (define ESCAPE равен 27)
}
Теперь, кажется, становится понятнее. Простите моё незнание лексики языка (я совсем недавно начал изучать c++), не могли бы вы пояснить, получается, "do{}" - это оператор цикла, а "while()" - это условие его продолжения? Спасибо, я попробую накодить такое. В теории, пока я не введу <ESC>, программа не продолжит работу?
19n1ght
2 / 2 / 0
Регистрация: 13.02.2013
Сообщений: 15
21.08.2013, 02:05     Сравнение символов в операторе if #9
Цитата Сообщение от fingolfin_ Посмотреть сообщение
получается, "do{}" - это оператор цикла, а "while()" - это условие его продолжения?
While в данном случае это условие выхода.

do while это один из операторов цикла (их три - while, do while и for).
while сперва проверяет условие (в скобках), затем выполняет тело цикла. Do while сперва выполняет тело цикла, затем проверяет условие. do while предпочтительнее в тех случаях, когда нам необходимо, чтобы тело цикла было выполнено как минимум один раз. Если используем while и условие ложное, то тело цикла не будет выполнено никогда.

Если перевести на псевдокод, то получится примерно следующее:

Выполнить тело do ( key = _getch(); cout << key << endl; ). Проверить не равен ли key ESCAPE. Если не равен, выполнить тело цикла do еще раз. Снова проверить. И так до тех пор, пока key не будет равен ESCAPE. Как только key становится равным ESCAPE, управление передается на следующую строку после while (в данном случае программа останавливается, так как после while ничего нет).

Можно использовать просто while, но в таком случае нам нужно инициализировать key при создании (иначе в условии while мы будем использовать "пустую" переменную key, что приведет к ошибке на этапе компиляции).
C++
1
2
3
4
5
6
int key = 0;
    while (key != ESCAPE)
    {
        key = _getch();
        cout << key << endl;
    }
В теории, пока я не введу <ESC>, программа не продолжит работу?
Верно. Пока Вы не нажмете ESCAPE, Вы не выйдете из цикла do while.
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 71
21.08.2013, 02:34  [ТС]     Сравнение символов в операторе if #10
Большое спасибо за подробное объяснение!
Замечу небольшую ошибку в объяснении: while - это всё таки условие продолжения цикла, т. к. если услови в скобках верно (KEY не равно ESCAPE), цикл ПРОДОЛЖАЕТ работу.
В любом случае спасибо.
19n1ght
2 / 2 / 0
Регистрация: 13.02.2013
Сообщений: 15
21.08.2013, 08:39     Сравнение символов в операторе if #11
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Большое спасибо за подробное объяснение!
Пожалуйста!
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Замечу небольшую ошибку в объяснении: while - это всё таки условие продолжения цикла, т. к. если услови в скобках верно (KEY не равно ESCAPE), цикл ПРОДОЛЖАЕТ работу.
В любом случае спасибо.
Компилятор неявно преобразовывает выражение в скобках к типу bool. Если оно true, то выражение в скобках выступает условием продолжения и тело цикла отрабатывает; если оно false, то выражение - условие выхода и в тело цикла компилятор не заходит.

Не помню что там в книгах сказано на этот счет, но, как по мне, это чисто субъективно как его называть, условие продолжения или выхода из цикла
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 18:19     Сравнение символов в операторе if
Еще ссылки по теме:

C++ Сравнение и замена символов
C++ сравнение символов в строке
Сравнение массива символов char C++

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

Или воспользуйтесь поиском по форуму:
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 71
23.08.2013, 18:19  [ТС]     Сравнение символов в операторе if #12
Цитата Сообщение от 19n1ght Посмотреть сообщение
C++
1
2
3
4
5
6
do 
    {
        key = _getch(); // получаем (int) значение нажатой клавиши
    } while (key != ESCAPE); // если Escape, то выходим из цикла do while (define ESCAPE равен 27)
If(key == 27 )
        exit(0);
Всё заработало. Но как мне сделать, что бы мог ввести в key другое число? Когда я меняю условие while
C++
1
while (key !=  27 || key != 49);
всё перестаёт работать. Даже при нажатии ESC не выходит.
Yandex
Объявления
23.08.2013, 18:19     Сравнение символов в операторе if
Ответ Создать тему
Опции темы

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