Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Stereotip
2 / 2 / 1
Регистрация: 17.04.2012
Сообщений: 22

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

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

Студворк — интернет-сервис помощи студентам
При вводе какого либо символа программа уходит в прострацию надо что бы программ распазновала что это символ и выводила 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2013, 18:17
Ответы с готовыми решениями:

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

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

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

19
 Аватар для Amator
1047 / 381 / 15
Регистрация: 11.11.2008
Сообщений: 3,155
01.07.2013, 18:23
А "какой либо символ" - вы пытаетесь ввести не число?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 18:27
Цитата Сообщение от Stereotip Посмотреть сообщение
return main();
Это как понимать?
Цитата Сообщение от Stereotip Посмотреть сообщение
yes_no();
Что за функция?
Это вообще весь код? Он у вас вообще компилировался?
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 18:38
Можно запустить всё в "вечный" цикл и ожидать правильного результата ввода:
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
Интересный такой момент
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
nxtech, main() это тоже функция и может быть ещё раз запущена/перезапущена.

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

Не по теме:

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



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

Не по теме:

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

0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:14
Учитывая тот факт, что при неправильном вводе будет ещё раз запущена 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
И опять не верно.

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

Не сейчас условие выполнится. не прав.
Но все равно это в нормально цикле нужно делать, а не рекурсивно стек забивать
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:19
я так полагаю, сработает вот эта инструкция:
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
Короче здравого смысла в таком коде все-равно нет. И преподаватель обязательно об этом скажет ТС.

Добавлено через 50 секунд
А вы можете продолжать в том же духе и не обращать внимания на мои высказывания
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
01.07.2013, 19:23
Цитата Сообщение от nxtech Посмотреть сообщение
Но все равно это в нормально цикле нужно делать, а не рекурсивно стек забивать
Согласен, но автору по сути нужен именно такой вариант.
0
 Аватар для Denisqwwq
38 / 32 / 7
Регистрация: 01.06.2013
Сообщений: 117
01.07.2013, 19:32
Если я правильно понял вопрос автора, то проверку на ввод символа можно осуществить след. образом:
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
01.07.2013, 20:26

Не по теме:

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

0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
01.07.2013, 20:40
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
 Аватар для Denisqwwq
38 / 32 / 7
Регистрация: 01.06.2013
Сообщений: 117
01.07.2013, 20:40
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
Olivеr, в этом случаи в теле while при невыполнении инструкции (val != 1 && val != 2) будет выполнено условие цикла, в чём, собственно, нет особой необходимости.
0
 Аватар для Stereotip
2 / 2 / 1
Регистрация: 17.04.2012
Сообщений: 22
02.07.2013, 00:43  [ТС]
согласен с 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
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.07.2013, 08:39
Цитата Сообщение от Stereotip Посмотреть сообщение
литературу в которой описано написанное вами?
Литература C++
1
 Аватар для Stereotip
2 / 2 / 1
Регистрация: 17.04.2012
Сообщений: 22
02.07.2013, 08:42  [ТС]
большое спасибо такой темы не находил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2013, 08:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru