Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
1

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

16.01.2017, 14:26. Просмотров 3177. Ответов 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;
}
0
Миниатюры
Visual C++ проверка ввода на число, проверка на кирилицу  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2017, 14:26
Ответы с готовыми решениями:

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

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

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

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

12
843 / 435 / 109
Регистрация: 06.07.2013
Сообщений: 1,437
16.01.2017, 14:45 2
Лучший ответ Сообщение было отмечено 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
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
16.01.2017, 14:49  [ТС] 3
Цитата Сообщение от 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
843 / 435 / 109
Регистрация: 06.07.2013
Сообщений: 1,437
16.01.2017, 14:51 4
дак вот , прога проверяет все цифры по очереди в цикле, и если хоть какая то не цифра - значит вся строка не число, а иначе - число, можно переименовать bool is_digit в is_number для правильности
1
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
16.01.2017, 15:16  [ТС] 5
Цитата Сообщение от 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
843 / 435 / 109
Регистрация: 06.07.2013
Сообщений: 1,437
16.01.2017, 15:24 6
Цитата Сообщение от Amadara Посмотреть сообщение
if (!(fff1>0))
вот эта строка, которая у тебя в коде, проверяет если количество цифр в строке <= 0, это означает что строка (/8) пройдет как цифра, потому что для выхода из цикла while, нужно чтобы количество цифр в строке было > 0, а тут есть одна цифра
1
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
16.01.2017, 15:25  [ТС] 7
Цитата Сообщение от Raali Посмотреть сообщение
вот эта строка, которая у тебя в коде, проверяет если количество цифр в строке <= 0, это означает что строка (/8) пройдет как цифра, потому что для выхода из цикла while, нужно чтобы количество цифр в строке было > 0, а тут есть одна цифра
точно
а что с кириллицей?
0
843 / 435 / 109
Регистрация: 06.07.2013
Сообщений: 1,437
16.01.2017, 15:56 8
Цитата Сообщение от Amadara Посмотреть сообщение
а что с кириллицей?
не понял, а что с ней, прога думает что это цифра тож?
0
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
16.01.2017, 16:04  [ТС] 9
Цитата Сообщение от 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;
}
0
Миниатюры
Visual C++ проверка ввода на число, проверка на кирилицу  
12563 / 6795 / 1639
Регистрация: 30.01.2014
Сообщений: 11,204
16.01.2017, 17:03 10
Лучший ответ Сообщение было отмечено Amadara как решение

Решение

Amadara, в местах использования isdigit сделать так:
C++
1
isdigit((unsigned char)ghh[i])
2
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
16.01.2017, 17:10  [ТС] 11
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
DrOffset
16.01.2017, 18:54
  #12

Не по теме:

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

0
9 / 18 / 5
Регистрация: 17.12.2014
Сообщений: 321
17.01.2017, 19:44  [ТС] 13
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2017, 19:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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