Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/137: Рейтинг темы: голосов - 137, средняя оценка - 4.56
 Аватар для florgas
6 / 5 / 0
Регистрация: 28.09.2010
Сообщений: 366

Проверка на цифру

26.07.2011, 15:34. Показов 28759. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал относительно простую консольную игру. При запуске открывается меню, и там 3 пункта. Если человек вводит "4", то появляется сообщение об ошибке( это я смог реализовать), но если ввести любой другой символ( кроме цифры), например любую букву, то программа переходит в бесконечный цикл, и программа начинает выдавать текст, который выдавать она не должна. Как сделать проверку что это именно цифра?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2011, 15:34
Ответы с готовыми решениями:

проверка на цифру
Пока не смог разобраться - нужно при вводе матрицы проверить, ввожу ли я цифру или нет подскажите как вставить сюда эту проверку ( вернее...

Проверка на какую цифру оканчивается число
Задание: сделать проверку, является ли число кратным и при этом не заканчиваться цифрой 3. Проверку на кратность я сделал, это не сложно...

Регулярные выражения и проверка строки на цифру (Elixir)
Я решаю задачу и не могу понять как написать регулярное выражение условие: ...

14
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
26.07.2011, 15:38
isdigit
1
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.07.2011, 16:18
Лучший ответ Сообщение было отмечено как решение

Решение

проблема известная. для проверки полной корректности ввода (цифр) нужно использовать хитрые манипуляции с флагами ios.
чаще всего ими пренебрегают в мелких программах.
легче всего обрабатывать char-ки.

просто проверяешь

C++
1
2
3
4
5
6
7
char ch=0;
 
while (!strchr("123",ch)) { 
cout << "input:\n";
cin >> ...
 
}
Добавлено через 25 минут
примерно так решается с помощью флагов ios:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int i;
 
    do {
        
        std::cin.clear();
        std::cout << "Val: ";
        std::cin >> i;
        std::cin.ignore();
 
        if (std::cin.fail()) {
            std::cout << "Incorrect input.\n";
            std::cin.sync();
        }
 
    } while (std::cin.fail());
 
 
    std::cout << "Value = " << i << '\n';
3
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
26.07.2011, 18:03
OstapBender, да ладно Вам, не так уж и много чисто сама проверка занимает места, 4 строки же буквально:
C++
1
2
3
4
5
6
    while(cin.fail())
    {
        cin.clear();
        cin.sync();
        cin>>x;
    }

Не по теме:


Хотя можно чтобы была и одна:

C++
1
while(cin.fail()){cin.clear();cin.sync();cin>>x;}
:D

0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.07.2011, 18:40
Gepar, в вашем коде тело while не исполнится ни разу, думаю не надо описывать почему.
ну если поменять на do .. while и добавить cin.ignore() и вывод об ошибке - вот и мой код получился.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
27.07.2011, 10:53
Зачем так извращаться то..
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
int main(){
    char ch;
    std::cin >> ch;
    int num;
    if (ch < '0' || ch > '9'){
        std::cerr << "Incorrect input";
        return 1;
    }
    num = ch - '0';
    return 0;
}
0
 Аватар для Fenixsar
3 / 3 / 1
Регистрация: 26.08.2008
Сообщений: 31
26.09.2011, 16:46
Цитата Сообщение от OstapBender Посмотреть сообщение
примерно так решается с помощью флагов ios:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int i;
 
    do {
        
        std::cin.clear();
        std::cout << "Val: ";
        std::cin >> i;
        std::cin.ignore();
 
        if (std::cin.fail()) {
            std::cout << "Incorrect input.\n";
            std::cin.sync();
        }
 
    } while (std::cin.fail());
 
 
    std::cout << "Value = " << i << '\n';
Если вводишь число, то выводит именно его, но если буквы, то получается бесконечный цикл. В чем может быть проблема?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.09.2011, 17:01
florgas, вот алгоритм, который позволяет определять что вы вводите, ввод прекратиться как только будет введена не цифра(подтверждать вод клацаньем Enter не нужно. Считаю что при построении меню лучше использовать возможности getch (жать только 1-н символ и не подтверждать его Enter-ом). Проверка является ли символ цифрой выполняю стандартной функцией stdlib.h : isdigit
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdlib>
#include <conio.h>
 
using namespace std;
 
int main()
{
    char ch;
    std::cout<<"Enter number\r\n";
    while(isdigit(ch = getch()))
        std::cout<<ch;
    std::cout<<"\r\nInput char not integer\r\n";
    std::cout<<"This char "<<ch<<"\r\n";
    std::cout<<"Press any key to continue\r\n";
    getch();
    return 0;
}
Enter number
123
Input char not integer
This char a
Press any key to continue
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.09.2011, 17:11
Решил не откладывать в долгий ящик, вот модель меню без дополнительного клацания по Enter
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
 
using namespace std;
 
int main()
{
    char ch;
    bool bMenu = true;
    
    std::cout<<"\t***MENU***\r\n";
    for(int i = 0; i < 9; i++)
        std::cout<<i + 1<<" item\r\n";
    do
    {
        std::cout<<"Enter menu item\r\n";
        switch((ch = getch()) - '0')
        {
            case 1:
                std::cout<<1<<" item chosen\r\n";
                break;
            case 2:
                std::cout<<2<<" item chosen\r\n";
                break;
            case 3:
                std::cout<<3<<" item chosen\r\n";
                break;
            case 4:
                std::cout<<4<<" item chosen\r\n";
                break;
            case 5:
                std::cout<<5<<" item chosen\r\n";
                break;
            case 6:
                std::cout<<6<<" item chosen\r\n";
                break;
            case 7:
                std::cout<<7<<" item chosen\r\n";
                break;
            case 8:
                std::cout<<8<<" item chosen\r\n";
                break;
            case 9:
                std::cout<<9<<" item chosen\r\n";
                break;
            default:
                bMenu = false;
                break;
        }
        if(!isdigit(ch))
        {
            std::cout<<"\r\nInput char not integer\r\n";
            std::cout<<"This char "<<ch<<"\r\n";
        }
    }
    while(bMenu);
    std::cout<<"Press any key to continue\r\n";
    getch();
    return 0;
}
Миниатюры
Проверка на цифру  
1
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 17:45
...
switch((ch = getch()) - '0')
{
case 1:
std::cout<<1<<" item chosen\r\n";
break;
case 2:
std::cout<<2<<" item chosen\r\n";
break;
case 3:
std::cout<<3<<" item chosen\r\n";
break;
case 4:
std::cout<<4<<" item chosen\r\n";
break;
case 5:
std::cout<<5<<" item chosen\r\n";
break;
case 6:
std::cout<<6<<" item chosen\r\n";
break;
case 7:
std::cout<<7<<" item chosen\r\n";
break;
case 8:
std::cout<<8<<" item chosen\r\n";
break;
case 9:
std::cout<<9<<" item chosen\r\n";
break;
default:
bMenu = false;
break;
}

думаю это можно было точно сделать короче )

Fenixsar, так а в чём проблема?
в том и соль что программа ждет корректного ввода.
0
 Аватар для Fenixsar
3 / 3 / 1
Регистрация: 26.08.2008
Сообщений: 31
26.09.2011, 17:47
Цитата Сообщение от OstapBender Посмотреть сообщение
Fenixsar, так а в чём проблема?
в том и соль что программа ждет корректного ввода.
Да, но хотелось, чтобы программа в случае ввода не числа, запрашивала переменную заново, а не уходила в бесконечный цикл.
Миниатюры
Проверка на цифру  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
26.09.2011, 17:55
Цитата Сообщение от OstapBender Посмотреть сообщение
думаю это можно было точно сделать короче )
- ну понятное дело!под строкой
Цитата Сообщение от OstapBender Посмотреть сообщение
std::cout<<1<<" item chosen\r\n";
подразумевал выполнения определённого пункта а не печать строки...
Fenixsar, вы можете вернуть ввод по другому обработав if или default

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
default:
* * * * * * * * * * * * * * * * bMenu = false;
* * * * * * * * * * * * * * * * break;
* * * * * * * * }
* * * * * * * * if(!isdigit(ch))
* * * * * * * * {
* * * * * * * * * * * * std::cout<<"\r\nInput char not integer\r\n";
* * * * * * * * * * * * std::cout<<"This char "<<ch<<"\r\n";
* * * * * * * * }
* * * * }
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 18:36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
подразумевал выполнения определённого пункта а не печать строки...
ясно)

Fenixsar, прощу прощения, на gcc у меня почему-то тоже уходит в бесконечный цикл. я до этого в VS 2008 и 2010 тока проверял.
сейчас чуть чуть занят, ночью попробую понять почему падает.
0
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
29.11.2016, 01:59
уже 5 лет прошло, я проверил вариант, и на Visual Studio 2017, он уходит в бесконечный цикл.

может кто за эти 5 лет что придумал что бы выполнялась проверка на ввод цифр и если введенное не цифра то вводить заново?
0
0 / 0 / 0
Регистрация: 02.05.2018
Сообщений: 6
03.05.2018, 17:48
Кто то нашел ошибку?) почему при вводе не цифры программа уходит в бесконечный цикл?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2018, 17:48
Помогаю со студенческими работами здесь

Опишите процедуру, заменяющую в файле каждую цифру на следующую по величине цифру.
помогите пожалуйста написать процедуру: type myfile = file of char; Опишите процедуру next(f), заменяющую в файле каждую ЦИФРУ на...

Перенести цифру из Memo содержащего текст и цифру в Edit по нажатию на кнопку
У меня есть на форме есть Memo и при запуске программы в него будет вводиться текст и цифра.Также у меня есть Edit и я хочу чтобы при...

После нажатия на цифру 1 фигура начинает двигаться вправо, а на цифру 2 – влево
2)Дана фигура в случайном месте, после нажатия на цифру 1 фигура начинает двигаться вправо, а на цифру 2 – влево и останавливается,...

Вывести вначале последнюю цифру трехзначного числа, а затем — его среднюю цифру
//Дано трехзначное число. Вывести вначале его последнюю цифру //(единицы), а затем — его среднюю цифру (десятки). var a,b,c: integer; ...

Лотерея. Программа выбирает одну цифру, выигрывают те, чей номер заканчивается на ту цифру
нужно написать программу которая позволяет загружать данные о 10 абонентах(Имя и 9-ти значный номер телефона) и выборе победителя следующим...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru