Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322

Visual C++ проверка ввода на число, проверка на кирилицу

16.01.2017, 14:26. Показов 7803. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом.

Этот код проверяет на буквы и знаки, но вылетает на кириллице и значениях типа "/5" или "*5"
как это можно отладить?

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
int laba4::check_number()
{
    int mmm = 0;
    char ghh[255];
    char *pghh;
    int fff1;
    int fff2;
    do {
        fff1 = 0;
        fff2 = 0;
        std::cout << std::endl;
        std::cout << "Введите число : ";
        std::cin >> ghh;
        int ghh_strlen = strlen(ghh);
        pghh = new char[ghh_strlen];
        mmm = std::atoi(ghh);
        for (int i = 0; i < ghh_strlen; i++) {
            fff1 += std::isalnum(ghh[i]);
            fff2 += std::isalpha(ghh[i]);
        }
        if (!(fff1>0) || (fff2>0))
        {
            std::cout << "Введенное значение не число : " << std::endl;
        }
    } while (!(fff1>0) || (fff2>0));
    delete[] pghh;
    return mmm;
}
Миниатюры
Visual C++ проверка ввода на число, проверка на кирилицу  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.01.2017, 14:26
Ответы с готовыми решениями:

проверка на латинскую кирилицу
Доброе время суток Задан текстовый файл. Вывести сначала содержащиеся в нем цифры, а затем – латинские буквы в обратном порядке. ...

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

Проверка правильности ввода: входит ли число в диапазон?
Необходимо ввести число в диапазоне от 1 до 8. Правильность ввода числа типа int уже проверена, но как проверить, входит ли введенное число...

12
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
16.01.2017, 14:45
Лучший ответ Сообщение было отмечено Amadara как решение

Решение

что то у тебя все как то запутано - проверь сразу на то, что это не число

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool is_digit;
do
{
...
 
   is_digit = true;
   for(int i = 0; i < ghh_strlen; ++i)
   {
      if(!isdigit(ghh[i])
      {
         is_digit = false;
         break;
      }
   }
 
   if(!is_digit)
      std::cout << "Введенное значение не число : " << std::endl;
}
while(!is_digit)
1
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
16.01.2017, 14:49  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
что то у тебя все как то запутано - проверь сразу на то, что это не число

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool is_digit;
do
{
...
 
   is_digit = true;
   for(int i = 0; i < ghh_strlen; ++i)
   {
      if(!isdigit(ghh[i])
      {
         is_digit = false;
         break;
      }
   }
 
   if(!is_digit)
      std::cout << "Введенное значение не число : " << std::endl;
}
while(!is_digit)

это проверка на цифру?, а мне нужно на число.
как быть если меню из например 12 ??
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
16.01.2017, 14:51
дак вот , прога проверяет все цифры по очереди в цикле, и если хоть какая то не цифра - значит вся строка не число, а иначе - число, можно переименовать bool is_digit в is_number для правильности
1
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
16.01.2017, 15:16  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
дак вот , прога проверяет все цифры по очереди в цикле, и если хоть какая то не цифра - значит вся строка не число, а иначе - число, можно переименовать bool is_digit в is_number для правильности
перевел на isdigit, работает, но проблема осталась, /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
#include <cctype> //isalnum
#include <locale> // для функции isdigit
    setlocale(LC_ALL, "Russian");
 
int laba4::check_number_isdigit() //метод проверки на число
{
    int mmm = 0;
    char ghh[255];
    char *pghh;
    int fff1;
    do {
        fff1 = 0;
        std::cout << std::endl;
        std::cout << "Введите число : ";
        std::cin >> ghh;
        int ghh_strlen = strlen(ghh);
        pghh = new char[ghh_strlen];
        mmm = std::atoi(ghh); // конвертация текста в число
        for (int i = 0; i < ghh_strlen; i++) {
            fff1 += std::isdigit(ghh[i]); //проверка на цифру или букву
        }
        if (!(fff1>0))
        {
            std::cout << "Введенное значение не число : " << std::endl;
        }
    } while (!(fff1>0));
    delete[] pghh;
    return mmm;
}
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
16.01.2017, 15:24
Цитата Сообщение от Amadara Посмотреть сообщение
if (!(fff1>0))
вот эта строка, которая у тебя в коде, проверяет если количество цифр в строке <= 0, это означает что строка (/8) пройдет как цифра, потому что для выхода из цикла while, нужно чтобы количество цифр в строке было > 0, а тут есть одна цифра
1
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
16.01.2017, 15:25  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
вот эта строка, которая у тебя в коде, проверяет если количество цифр в строке <= 0, это означает что строка (/8) пройдет как цифра, потому что для выхода из цикла while, нужно чтобы количество цифр в строке было > 0, а тут есть одна цифра
точно
а что с кириллицей?
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
16.01.2017, 15:56
Цитата Сообщение от Amadara Посмотреть сообщение
а что с кириллицей?
не понял, а что с ней, прога думает что это цифра тож?
0
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
16.01.2017, 16:04  [ТС]
Цитата Сообщение от Raali Посмотреть сообщение
не понял, а что с ней, прога думает что это цифра тож?

вылетает с ошибкой

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
int laba4::check_number_isdigit() //метод проверки на число
{
            int mmm = 0;
    char ghh[255];
    char *pghh;
    int fff1 = 0;
    do {
        std::cout << std::endl; 
        std::cout << "Введите число : ";
        std::cin >> ghh;
        int ghh_strlen = strlen(ghh);
        pghh = new char[ghh_strlen];
            mmm = std::atoi(ghh); // конвертация текста в число
 
        for (int i = 0; i < ghh_strlen; i++) {
        std::cout << "  ghh[i] : " << isdigit(ghh[i]) << std::endl;
        fff1 = ghh[i];
            if (isdigit(ghh[i]) == 0) {
                fff1 = 0;
                //break;
            }
        }
            if ((fff1==0))
            {
                std::cout << "Введенное значение не число : " << std::endl;
            }
    } while ((fff1==0));
    delete[] pghh;
            return mmm;
}
Миниатюры
Visual C++ проверка ввода на число, проверка на кирилицу  
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
16.01.2017, 17:03
Лучший ответ Сообщение было отмечено Amadara как решение

Решение

Amadara, в местах использования isdigit сделать так:
C++
1
isdigit((unsigned char)ghh[i])
2
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
16.01.2017, 17:10  [ТС]
char — от -128 до 127
signed char От -128 до 127
unsigned char От 0 до 255

получается кириллица это свыше 127 , точно


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
int laba4::check_number_isdigit() //метод проверки на число
{
            int mmm = 0;
    char ghh[255];
    char *pghh;
    int fff1 = 0;
    do {
        std::cout << std::endl; 
        std::cout << "Введите число : ";
        std::cin >> ghh;
        int ghh_strlen = strlen(ghh);
        pghh = new char[ghh_strlen];
            mmm = std::atoi(ghh); // конвертация текста в число
 
        for (int i = 0; i < ghh_strlen; i++) {
        std::cout << "  ghh[i] : " << isdigit((unsigned char)ghh[i]) << std::endl;
        fff1 = ghh[i];
            if (isdigit(ghh[i]) == 0) {
                fff1 = 0;
                //break;
            }
        }
            if ((fff1==0))
            {
                std::cout << "Введенное значение не число : " << std::endl;
            }
    } while ((fff1==0));
    delete[] pghh;
            return mmm;
}
0
16.01.2017, 18:54

Не по теме:

Amadara, а 18 строку чего ж не исправил? :)

0
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
17.01.2017, 19:44  [ТС]
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
int laba4::check_number_isdigit() //метод проверки на число
{
    int mmm = 0;
    char ghh[255];
    char *pghh;
    int fff1 = 0;
    do {
        std::cout << std::endl; 
        std::cout << "Введите число : ";
        std::cin >> ghh;
        int ghh_strlen = strlen(ghh);
        pghh = new char[ghh_strlen];
            mmm = std::atoi(ghh); // конвертация текста в число
 
        for (int i = 0; i < ghh_strlen; i++) {
        std::cout << "  ghh[i] : " << isdigit((unsigned char)ghh[i]) << std::endl;
        fff1 = ghh[i];
            if (isdigit((unsigned char)ghh[i]) == 0) {
                fff1 = 0;
                //break;
            }
        }
            if ((fff1==0))
            {
                std::cout << "Введенное значение не число : " << std::endl;
            }
    } while ((fff1==0));
    delete[] pghh;
            return mmm;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2017, 19:44
Помогаю со студенческими работами здесь

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

Проверка ввода
Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно к примеру задать числовой масив типа (int). Как зделать так...

Проверка ввода
Доброго вам времени суток. Бывалые, подскажите неопытному, как лучше писать? И если несложно, то скажите почему. for(;;) { ...

Проверка ввода
fflush(stdin) не работает и происходит зацикливание. как быть, что делать? int main(void) { int val = 1; int num = 1; ...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 09.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru