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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.85
florgas
5 / 4 / 0
Регистрация: 28.09.2010
Сообщений: 345
#1

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

26.07.2011, 15:34. Просмотров 5903. Ответов 13
Метки нет (Все метки)

Написал относительно простую консольную игру. При запуске открывается меню, и там 3 пункта. Если человек вводит "4", то появляется сообщение об ошибке( это я смог реализовать), но если ввести любой другой символ( кроме цифры), например любую букву, то программа переходит в бесконечный цикл, и программа начинает выдавать текст, который выдавать она не должна. Как сделать проверку что это именно цифра?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2011, 15:34     Проверка на цифру
Посмотрите здесь:

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

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

Дано двузначное число. Вывести вначале его левую цифру, а затем — его правую цифру - C++
1)Дано двузначное число. Вывести вначале его левую цифру (десятки),а затем — его правую цифру (единицы). Для нахождения десятков...

...заканчивающиеся на цифру К - C++
дан массив. нужно сформировать массив, в котором будут только элементы исходного, заканчивающиеся на цифру К. подскажите, пожалуйста,...

Определить k-цифру - C++
Даны целое число k ( ) и последовательность цифр 123…91011…9899100101…109110, в которой выписаны подряд все натуральные числа от 1 до 110....

найти цифру - C++
господа прграмисты возник такой вопрос-возможно в консольном приложении,на с++,выводя на экран при помощи "Cout" найти допустим...

Преобразование символа в цифру - C++
Есть строка состоящая только из цифр. Как создать массив целочисленных цифр, образующие исходную строку? пару строчек кода достаточно!

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.07.2011, 15:38     Проверка на цифру #2
isdigit
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
26.07.2011, 16:18     Проверка на цифру #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
проблема известная. для проверки полной корректности ввода (цифр) нужно использовать хитрые манипуляции с флагами 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';
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
26.07.2011, 18:03     Проверка на цифру #4
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;}

OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
26.07.2011, 18:40     Проверка на цифру #5
Gepar, в вашем коде тело while не исполнится ни разу, думаю не надо описывать почему.
ну если поменять на do .. while и добавить cin.ignore() и вывод об ошибке - вот и мой код получился.
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
27.07.2011, 10:53     Проверка на цифру #6
Зачем так извращаться то..
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;
}
Fenixsar
3 / 3 / 0
Регистрация: 26.08.2008
Сообщений: 19
26.09.2011, 16:46     Проверка на цифру #7
Цитата Сообщение от 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';
Если вводишь число, то выводит именно его, но если буквы, то получается бесконечный цикл. В чем может быть проблема?
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 17:01     Проверка на цифру #8
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
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 17:11     Проверка на цифру #9
Решил не откладывать в долгий ящик, вот модель меню без дополнительного клацания по 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;
}
Миниатюры
Проверка на цифру  
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 17:45     Проверка на цифру #10
...
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, так а в чём проблема?
в том и соль что программа ждет корректного ввода.
Fenixsar
3 / 3 / 0
Регистрация: 26.08.2008
Сообщений: 19
26.09.2011, 17:47     Проверка на цифру #11
Цитата Сообщение от OstapBender Посмотреть сообщение
Fenixsar, так а в чём проблема?
в том и соль что программа ждет корректного ввода.
Да, но хотелось, чтобы программа в случае ввода не числа, запрашивала переменную заново, а не уходила в бесконечный цикл.
Миниатюры
Проверка на цифру  
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 17:55     Проверка на цифру #12
Цитата Сообщение от 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";
* * * * * * * * }
* * * * }
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
26.09.2011, 18:36     Проверка на цифру #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
подразумевал выполнения определённого пункта а не печать строки...
ясно)

Fenixsar, прощу прощения, на gcc у меня почему-то тоже уходит в бесконечный цикл. я до этого в VS 2008 и 2010 тока проверял.
сейчас чуть чуть занят, ночью попробую понять почему падает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2016, 01:59     Проверка на цифру
Еще ссылки по теме:

как извлеч цифру - C++
господа програмисты есть такой вопрос допустим есть файл .txt и внём записанно определённое число,как это число можно присвоить переменной?...

Поменять 1-ую и 3-ю цифру числа n - C++
Дано целое, положительное четырёхзначное n, записанное в одной (!) переменной, либо (см. вариант) два трёхзначных целых числа p и q,...

Найти последнюю цифру a^b - C++
В input.txt лежат а и b-число и степень. В output.txt нужно вывести последнюю цифру a^b. a и b не превышают 10000. Должно быть...

Извлечь цифру из массива - C++
Добрый вечер. Нужно извлечь цифру из массива, к примеру char s=&quot;12345&quot;; Пробывал вычитать '0' и atoi, безрезультатно. что мне...

Вывести цифру прописью - C++
Сделайте вектор проведение десяти строк значения &quot;ноль&quot; , &quot;один&quot; , .. &quot;девятку&quot; . Используйте это в программе, которая преобразует цифру в...


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

Или воспользуйтесь поиском по форуму:
Amadara
1 / 1 / 2
Регистрация: 17.12.2014
Сообщений: 143
29.11.2016, 01:59     Проверка на цифру #14
уже 5 лет прошло, я проверил вариант, и на Visual Studio 2017, он уходит в бесконечный цикл.

может кто за эти 5 лет что придумал что бы выполнялась проверка на ввод цифр и если введенное не цифра то вводить заново?
Yandex
Объявления
29.11.2016, 01:59     Проверка на цифру
Ответ Создать тему
Опции темы

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