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

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

Войти
Регистрация
Восстановить пароль
 
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 80
#1

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

19.08.2013, 23:38. Просмотров 1018. Ответов 11
Метки нет (Все метки)

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

Сравнение символов - C++
#include <iostream> using namespace std; int main() { char t = "ab"; char j = "ac"; if(t > j)cout << 5; ...

Сравнение символов из строки - C++
getline(cin, Text); for (i = 1; i <= Text.length(); i++) { 16: if ((Text == " ") && (Text == " ")) { 18: ...

Сравнение русских символов. - C++
Проблема с русскими символами. Русские символы заносятся в массив занимая две ячейки( 2 байта ). Думаю это связано с UTF-8 кодировкой. ...

сравнение символов в строке - C++
Подскажите, пожалуйста, как можно сравнить каждое слово в строке с несколькими буквами (которые отдельно задаются с клавиатуры). Если...

Сравнение и замена символов - C++
У меня есть файл с которого я считываю информацию массив. Если встречается определенный символ то мне нужно заменить его на другой. И...

Сравнение и замена символов в строке - C++
У меня в файле записан определенный текст, мне нужно читать каждое слово и если встречается в этом слове определенный символ, то заменять...

11
MickeyBlueEyes
Студент
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
19.08.2013, 23:51 #2
C++
1
2
if((режим=getchar()) == 27) //"режим" - это имя пременной
        exit(0);
27 код escape, а сравниваете вы символ со строкой, "esc" - строка, 'a' - символ
1
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 80
20.08.2013, 04:13  [ТС] #3
Спасибо за ответ, но этот вариант я уже пробовал, и программа не заработала. То есть: когда программа доходит до данного участка, я нажимая ESC, затем ENTER, но завершения работы программы не происходит. Я пробовал включить режим отладки, но я запускал его в первый раз, поэтому не знаю, как он работает. По крайней мере на всех этапах выполнения программы при наведении курсора на имя переменной выводилась следующая подсказка: unsigned short режим (я полагаю, что значение переменной не менялось, верно?)
Возможно проблема кроется именно в том, что я использую тип unsigned short, а не char, но если это так, какой тип мне нужно использовать, что бы я имел возможность работать с переменной как с числом?
0
dmitry94
561 / 191 / 36
Регистрация: 25.05.2012
Сообщений: 798
20.08.2013, 04:42 #4
C++
1
2
3
4
5
void main()
{
    int key;
    do key=getch(); while (key != 27);   
}
1
MickeyBlueEyes
Студент
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
20.08.2013, 12:19 #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.
1
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 80
20.08.2013, 14:40  [ТС] #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. Пробовал разные типы переменных.
0
19n1ght
2 / 2 / 0
Регистрация: 13.02.2013
Сообщений: 15
21.08.2013, 01:24 #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)
}
1
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 80
21.08.2013, 01:53  [ТС] #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>, программа не продолжит работу?
0
19n1ght
2 / 2 / 0
Регистрация: 13.02.2013
Сообщений: 15
21.08.2013, 02:05 #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.
1
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 80
21.08.2013, 02:34  [ТС] #10
Большое спасибо за подробное объяснение!
Замечу небольшую ошибку в объяснении: while - это всё таки условие продолжения цикла, т. к. если услови в скобках верно (KEY не равно ESCAPE), цикл ПРОДОЛЖАЕТ работу.
В любом случае спасибо.
0
19n1ght
2 / 2 / 0
Регистрация: 13.02.2013
Сообщений: 15
21.08.2013, 08:39 #11
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Большое спасибо за подробное объяснение!
Пожалуйста!
Цитата Сообщение от fingolfin_ Посмотреть сообщение
Замечу небольшую ошибку в объяснении: while - это всё таки условие продолжения цикла, т. к. если услови в скобках верно (KEY не равно ESCAPE), цикл ПРОДОЛЖАЕТ работу.
В любом случае спасибо.
Компилятор неявно преобразовывает выражение в скобках к типу bool. Если оно true, то выражение в скобках выступает условием продолжения и тело цикла отрабатывает; если оно false, то выражение - условие выхода и в тело цикла компилятор не заходит.

Не помню что там в книгах сказано на этот счет, но, как по мне, это чисто субъективно как его называть, условие продолжения или выхода из цикла
0
fingolfin_
3 / 3 / 0
Регистрация: 19.08.2013
Сообщений: 80
23.08.2013, 18:19  [ТС] #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 не выходит.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 18:19
Привет! Вот еще темы с ответами:

Сравнение символов char и string - C++
Здравствуйте, подскажите пожалуйста - нужно сравнить первую букву введенного слова с символом (при условии, что и символ, с которым...

Сравнение кол-ва символов рекурсией - C++
Применить рекурсивную функцию для определения каких цифр (1, 2, 3) больше среди цифр натурального числа. Попытался сам сделать, но...

Сравнение массива символов char - C++
День добрый. Пытаюсь сделать так: char nomer,nomer2; //Тут по ходу выполнения программы посимвольно в оба массива вписывались одни и...

Сравнение строк без нескольких символов - C++
Здравствуйте, у меня вопрос по сабжу. Есть задание на написание парсера, всё бы хорошо, только не знаю как оптимально сравнивать строки...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
23.08.2013, 18:19
Ответ Создать тему
Опции темы

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