0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 19
1

Цикл с проверкой isdigit

06.09.2015, 23:43. Показов 13171. Ответов 7
Метки нет (Все метки)

Друзья, подскажите - есть такой код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void main()
{
    setlocale(LC_ALL, "rus");
    int i=0;
    for (;;)
    {
    cin >> i;
 
        if (!isdigit(i))
        {
            cout << "Цифра" << endl;
        }
        if (isdigit(i))
        {
            cout << "Буква" << endl;
        }
    }
 
    system("pause");
}
Поправьте меня если я не прав:
1. ISDIGIT - проверяет цифра/не цифра в переменной char. Вернет TRUE если цифра.FALSE если символ
2. Если мы проверяем переменную не char а int - возвращаемое значение почему то противоположно. т.е проверка !isdigit. Не совсем понятно почему
3. При таком коде если я ввожу символ - происходит бесконечный цикл, при чем странно что он попадает в первый IF , но не отрабатывает ввод из потока
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2015, 23:43
Ответы с готовыми решениями:

Цикл с проверкой
Здраствуйте. Пишу крестики\нолики в консоле,и вобщем возникла проблема с проверкой. do { ...

Цикл while. Затруднения с составления программы с простым алгоритмом и проверкой подлинности
Здравствуйте, подскажите пожалуйста, у меня в ответе получается 34.75. Как быстро подсчитать и...

Цикл с проверкой всех переменных
проблема в реализации цикла с проверкой всех переменных. function endgame(){ for (var i=0; i&lt;9;...

Как создать цикл с проверкой условия содержимое ax>=0, на ассемблере
Как создать цикл чтобы в нём были : i -счётчик, m=8, k=-1, m=m+k, m&gt;0, если да, то k=k+2, m=m+k, и...

7
Эксперт PHP
3101 / 2586 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
06.09.2015, 23:58 2
1) да
2) нет, char - целочисленная переменная, содержащая числовой код символа, для цифр это коды от 48(0) до 57(9). Именно они должны вводиться в переменную типа int, чтобы проверка на isdigit вернула true.
3) при считывании из потока элемента неверного типа (например, char в int), он (поток) переходит в состояние ошибки. А так как это состояние не изменяется, то дальнейший ввод невозможен, а так как нет условия выхода из цикла, то он (цикл) становится бесконечным. А в первый if попадает, потому что i равно нулю, а код 0 - это не цифра, а символ конца строки, он же нулевой символ, он же нуль-терминатор. А это в свою очередь доказывает, что у Вас неверно составлены условия.
1
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 19
07.09.2015, 00:37  [ТС] 3
Спасибо, на сколько я понял применять isdigit для типа int не правильно. Т.е буду думать другую проверку на ввод не цифры
Кстати если поток входит в ошибку - возможно ли отловить этот вход(в ошибку) , обнулить состояние (ошибки) и предложить ввод заново?
-как в таком случае очистить поток от ошибок/изменить состояние?

и еще не совсем понятно про 0, который совсем не ноль если можно - дайте разъяснение, очень интересно разобраться
0
7175 / 6147 / 2805
Регистрация: 14.04.2014
Сообщений: 26,494
07.09.2015, 08:28 4
C++
1
2
3
4
5
if (cin.fail()) // ошибка ввода
 
cin.clear(); // сброс
char c = '\0';
while (c != '\n') c = cin.get(); // очистка
0
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 19
10.09.2015, 23:26  [ТС] 5
1,2 строки - если ошибка потока, сбросить его
а что в 4,5 строках?
0
lss
939 / 867 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
10.09.2015, 23:56 6
Цитата Сообщение от maks1710 Посмотреть сообщение
Т.е буду думать другую проверку на ввод не цифры
C++
1
2
3
4
5
6
7
8
// в строке ввода только цифры, перед которыми могут быть + или -.
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
0
0 / 1 / 0
Регистрация: 30.08.2015
Сообщений: 34
01.02.2019, 01:38 7
Подскажите кто знает!
В 72 строке ,в условии где isdigit использую через ||(или) если ввожу букву и число ,то он принимает ее за нуль , если введу 2 буквы тогда отрабатывает правильно,выводит сообщение об ошибке.
В чем проблема таиться кто знает?

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//Laba 7.Вариант 30 Функция выделяет из заданной строки подстроку заданной длины, начиная с заданной позиции.
 
#include <iostream>
#include <cctype>   // для функции isdigit
#include <cstdlib>  // для функции atoi
 
using namespace std;
 
char* stroka(char* temp, int positia, int dlina) {
 
    int size = dlina - positia+1;
    char* z = new char[size];
    int k = 0;
 
    for (int i = positia; i < dlina; i++) {
        z[k] = temp[i];
        k++;
    }
    z[k] = '\0';
 
    cout << size << endl;
 
    return z;
}
 
 
int mylen(char str[], int n) {
 
    int i = 0;
    int k = 0;
 
    while (str[i]) {
 
        if (str[i] != '\0') {
            k++;
        }
        i++;
    }
 
 
 
    return k;
}
 
 
int main() {
 
    setlocale(LC_ALL, "Rus");
 
 
    char a[500];
    
    cout << "Введите строку: ";
    cin.getline(a, 500);
 
    int k = mylen(a, 500);
    
    int len_substring, number_substring;
    char number[80], len[80];
 
    cout << "Введите номер элемента начала подстроки: ";
    cin >> number;
 
    cout << "Укажите длину подстроки. ";
    cin >> len;
 
    char* str;
    
 
 
 
    if (isdigit(number[0])||isdigit(len[0])) {
            
        number_substring = atoi(number);
        len_substring = atoi(len);
        
        cout << number_substring << len_substring << endl;
 
        if (number_substring <= k || len_substring <= k || 0 <= number_substring || 0 <= len_substring || len_substring > number_substring) {
 
            str = stroka(a, number_substring, len_substring);
            cout << str << endl;
 
            delete str;
        }
        else {
 
            cout << "Введенные значения выходят за пределы строки!\n";
 
        }
    }
    else {
        
        cout << "Введены неверные значения!" << endl;
 
    }
    
 
 
 
    system("pause");
    
    return 0;
}
0
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
01.02.2019, 18:16 8
Так будет проще:
C++
1
2
3
4
// Возвратить true если в строке беззнаковое целое
bool isD(const string& s) {
    return s.find_first_not_of("0123456789") == string::npos;
}
Проверка
C++
1
2
3
4
if (isD(str[i]))
{
//Ваше условие
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2019, 18:16
Помогаю со студенческими работами здесь

isdigit()
Здравствуйте. Почему не работает isdigit() в этом примере? Пробовал разные варианты. Задача в том...

isdigit
Возник вопрос по фукции isdigit в описании написано int isdigit(int c); и выходит что в...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

Function IsDigit()
Подскажите пожалуйста, как сделать так, чтобы я задавал число и он работал: c = int(input())...

isdigit() и кириллица
При этом коде если ввести символ из кириллицы выдаст ошибку. Как от неё избавиться? int main()...

isdigit() не понимаю
Здрасти всем! Не могу понять, почему isdigit() неверно себя ведет. Точнее абсолютно наоборот. ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru