2 / 2 / 1
Регистрация: 17.04.2012
Сообщений: 22
1

Проверка на ввод символа

01.07.2013, 18:17. Показов 2020. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При вводе какого либо символа программа уходит в прострацию надо что бы программ распазновала что это символ и выводила error
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
int main()
 
 
{
    unsigned int choice;
    
    srand(time(NULL));
    
    std::cout << "To Play write 1, end game 2" << std::endl;  std::cin >> choice;
    
    if ((choice > 2) && (choice < 1))
        
    {  
       std:: cout << "wrong number" << std::endl;
       return main();
    }
    
    else if(choice == 2) {std::cout << "Exit"; return 0;}
    
    else
    {
       yes_no();
       std::cout << sum_ochkov;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2013, 18:17
Ответы с готовыми решениями:

Проверка на ввод символа
Предположим вместо числа был введен символ, тогда после ввода символа пропускается вторая строчка...

Проверка на ввод символа
Пользователь вводит несколько строк (имя, фамилия и тд). Не могу сообразить как реализовать...

Ввод символа
char b; int c; puts(&quot;Int&quot;); scanf(&quot;%d&quot;, &amp;c); puts(&quot;Char&quot;); b = getchar(); putchar(b);...

Ввод специального символа.
Всем привет. У меня вопрос про символ -  Decimal 26 HEX 1A Подскажите как мне его...

19
1047 / 381 / 15
Регистрация: 11.11.2008
Сообщений: 3,155
01.07.2013, 18:23 2
А "какой либо символ" - вы пытаетесь ввести не число?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 18:27 3
Цитата Сообщение от Stereotip Посмотреть сообщение
return main();
Это как понимать?
Цитата Сообщение от Stereotip Посмотреть сообщение
yes_no();
Что за функция?
Это вообще весь код? Он у вас вообще компилировался?
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 18:38 4
Можно запустить всё в "вечный" цикл и ожидать правильного результата ввода:
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
30
31
32
33
34
#include <iostream>
#include <cstdlib>
#include <limits>
 
int main()
{
    unsigned int choice;
    srand(time(NULL));
 
    std::cin.exceptions(std::ios_base::failbit | std::ios_base::badbit);
    for ( ; ; )
    {
        try
        {
            std::cout << "To Play write 1, end game 2" << std::endl;  std::cin >> choice;
            break;
        }
        catch (std::ios_base::failure e)
        {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << e.what() << std::endl;
        }
    }
 
    if ((choice > 2) && (choice < 1))
    {
        std:: cout << "wrong number" << std::endl;
        return main();
    }
    else if(choice == 2) {
        std::cout << "Exit"; return 0;
    }
}
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 19:05 5
Интересный такой момент
C++
1
2
3
4
5
if ((choice > 2) && (choice < 1)) // При каких обстоятельствах выполнится это условие?
{
     std:: cout << "wrong number" << std::endl;
* * *return main();                      // И что это за вызов такой рекурсивный?
}
xtorne21st, нет там вечного цикла. Вы там break поставили, можно ввести 3 и все удачно завершится
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:08 6
nxtech, main() это тоже функция и может быть ещё раз запущена/перезапущена.

Добавлено через 1 минуту
Цитата Сообщение от nxtech Посмотреть сообщение
xtorne21st, нет там вечного цикла. Вы там break поставили
да ты прям мистер очевидность
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 19:09 7

Не по теме:

Не спорю, может. Но где в этом здравый смысл? Тем более что до return main никогда не добраться



Добавлено через 53 секунды

Не по теме:

капитан очевидность :D

0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:14 8
Учитывая тот факт, что при неправильном вводе будет ещё раз запущена main():
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
30
31
32
33
34
#include <iostream>
#include <cstdlib>
#include <limits>
 
int main()
{
    unsigned int choice;
    srand(time(NULL));
 
    std::cin.exceptions(std::ios_base::failbit | std::ios_base::badbit);
    try
    {
        std::cout << "To Play write 1, end game 2" << std::endl;  std::cin >> choice;
    }
    catch (std::ios_base::failure e)
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << e.what() << std::endl;
        return main();
    }
    if ((choice > 2) || (choice < 1))
    {
        std:: cout << "wrong number" << std::endl;
        return main();
    }
    else if(choice == 2) {
        std::cout << "Exit"; return 0;
    }
    else
    {
        std::cout << "Play!" << std::endl;
    }
}
Добавлено через 59 секунд
Цитата Сообщение от nxtech Посмотреть сообщение
Не спорю, может. Но где в этом здравый смысл? Тем более что до return main никогда не добраться
переделал - добраться!
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 19:16 9
И опять не верно.

Добавлено через 1 минуту
Что будет если я введу 3? Это ведь не верное значение.

Не сейчас условие выполнится. не прав.
Но все равно это в нормально цикле нужно делать, а не рекурсивно стек забивать
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:19 10
я так полагаю, сработает вот эта инструкция:
C++
1
2
3
4
5
if ((choice > 2) || (choice < 1))
    {
        std:: cout << "wrong number" << std::endl;
        return main();
    }
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 19:21 11
Короче здравого смысла в таком коде все-равно нет. И преподаватель обязательно об этом скажет ТС.

Добавлено через 50 секунд
А вы можете продолжать в том же духе и не обращать внимания на мои высказывания
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:23 12
Цитата Сообщение от nxtech Посмотреть сообщение
Но все равно это в нормально цикле нужно делать, а не рекурсивно стек забивать
Согласен, но автору по сути нужен именно такой вариант.
0
38 / 32 / 7
Регистрация: 01.06.2013
Сообщений: 117
01.07.2013, 19:32 13
Если я правильно понял вопрос автора, то проверку на ввод символа можно осуществить след. образом:
C++
1
2
3
4
5
6
7
    int choice;
    while (!(std::cin >> choice))    
    {
        std::cout << "Error!\n";
    std::cin.clear();
    std::cin.sync();
        }
0
xtorne21st
01.07.2013, 20:26
  #14

Не по теме:

Denisqwwq, как по мне, так std::istream::sync() сильно платформозависимый метод и не всегда даёт должный результат.

0
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
01.07.2013, 20:40 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <limits>
 
using namespace std;
 
int main()
{
    cout << "Enter 1 or 2\n";
    int val;
    while ( !(cin >> val) || (val != 1 && val != 2) ) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    cout << "You entered " << val;
    return 0;
}
0
38 / 32 / 7
Регистрация: 01.06.2013
Сообщений: 117
01.07.2013, 20:40 16
xtorne21st, не могу не согласиться

вариант с
C++
1
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
намного практичней, но и в нём подводных камней хватает.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 21:04 17
Olivеr, в этом случаи в теле while при невыполнении инструкции (val != 1 && val != 2) будет выполнено условие цикла, в чём, собственно, нет особой необходимости.
0
2 / 2 / 1
Регистрация: 17.04.2012
Сообщений: 22
02.07.2013, 00:43  [ТС] 18
согласен с return main() вышло круто)) а можно поинтересоваться литературу в которой описано написанное вами??

Добавлено через 8 минут
только недавно начал изучать С++ (около месяца) решил состряпать своими пока еще не ровными руками игру очко есть код там можно пока играть только одному но завтра думаю сделаю какое то подобие игрока компьютера. буду рад за объяснение ошибок и конечно литературу
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <cstdlib>
#include <ctime>
 
 
#define kolvo 9
 
int sum_ochkov = 0;
char* card[kolvo] = {"6","7","8","9","10","Jack","Queen","King","Ace"};
int ves_card[kolvo] = {6 , 7 , 8 , 9 , 10 , 2 , 3 , 4 , 11};
 
 
 
int random_card()
 
 
{
            int number = 0;
            int ochkov = 0;
            number = rand()%9;
            ochkov += ves_card[number];
            std::cout << "Card ---- " << card[number] << " ---- " << std::endl;
            return ochkov;
}
 
 
 
char yes_no()
 
 
{
        char ask;
        std::cout << "Do you need a card y or n ???" << std:: endl; std::cin >> ask;
        if (ask == 'y')
        {
            int ochkov = random_card();
            sum_ochkov += ochkov;
            std::cout << "Symma ochkov ravna = " << sum_ochkov << std::endl;
            if (sum_ochkov > 21)  {std::cout << "-----Surplus-----" << std::endl; return sum_ochkov;}
 
            else if (sum_ochkov == 21) {std::cout << "*****OchkO*****" << std::endl; return sum_ochkov;}
 
            yes_no();
        }
        else if (ask == 'n')
        {
            if (sum_ochkov < 21) {std::cout << "*****Nedobor*****" << std::endl;}
            return sum_ochkov;
 
        }
        else
        {
            std::cout << "wrong symbol" << std::endl;
            return yes_no();
        }
}
 
int start_game()
{
    unsigned int choice;
 
    std::cout << "To Play write 1, end game 2" << std::endl;  std::cin >> choice;
 
    if (choice >= 2 || choice < 1)
 
    {
 
       if (choice == 2) {std::cout << "Exit"; return 0;}
 
       else {std:: cout << "wrong number" << std::endl; start_game();}
    }
 
 
 
    else{yes_no();std::cout << sum_ochkov;}
}
int main()
 
 
{
        srand(time(NULL));
        start_game();
}
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
02.07.2013, 08:39 19
Цитата Сообщение от Stereotip Посмотреть сообщение
литературу в которой описано написанное вами?
Литература C++
1
2 / 2 / 1
Регистрация: 17.04.2012
Сообщений: 22
02.07.2013, 08:42  [ТС] 20
большое спасибо такой темы не находил.
0
02.07.2013, 08:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2013, 08:42
Помогаю со студенческими работами здесь

Пропускает ввод символа
Начал изучать с++ и в процессе выполнения наткнулся на проблему. В процессе выполнения программа...

Проверка вводимого символа
Привет.Помогите,надо сделать так ,чтобы в консольной программе при вводе цифр,вместо букв,выдавало...

Проверка символа на повторяемость.
Всем здравствуйте! При разработке программы столкнулся с проблемкой. Задача: На входе имеется...

Ввод одного символа и строки с пробелом
Подскажите, пожалуйста, как принять от пользователя с клавиатуры лишь один символ, не дав ему...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru