Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
maks1710
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 19
1

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

06.09.2015, 23:43. Просмотров 1232. Ответов 5
Метки нет (Все метки)

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2015, 23:43
Ответы с готовыми решениями:

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

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

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

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

Ошибка функции isdigit
Почему не выводит &quot;ERROR&quot;, ведь b это буква. Или я где-то ошибся. Помогите...

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

и еще не совсем понятно про 0, который совсем не ноль если можно - дайте разъяснение, очень интересно разобраться
0
nmcf
6412 / 5673 / 2582
Регистрация: 14.04.2014
Сообщений: 24,010
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
maks1710
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 19
10.09.2015, 23:26  [ТС] 5
1,2 строки - если ошибка потока, сбросить его
а что в 4,5 строках?
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
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
10.09.2015, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2015, 23:56

Массив char и isdigit()
// Задача, ввести строку, если попадется символ @ - закончить выполнение //...

циклы функций isdigit, insert
никак не могу разобраться как дописать следующие функции: int isdigit(char...

Не работает isdigit как задумано
int main() { setlocale(LC_ALL,&quot;Russian&quot; ); cout&lt;&lt;&quot;Введите...


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

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

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