Написал программу для вывода простых чисел от 0 до заданного пользователем. Споткнулся на проверке введенных символов. Вот текст программы:
Код:
#include <iostream>
#include <cmath>
#include <cctype>
using namespace std;
int main()
{
int i, n, ent;
bool sost;
cout << "Введите число от 0 до" << pow(16, sizeof(int)) << ": ";
cin >>ent;
--> Закомментированное ниже работает без вопросов
/* if (!isdigit(ent))
{
cout << "Ошибка: это не число";
return 1;
}
*/
while (ent < 0 || ent > pow(16, sizeof(int)) || (!isdigit(ent)))<-- Последнее условие не работает
{
cout << "Ошибка: введите правильное число\nПопробуйте снова :";
cin >> ent;
}
for (i = 2; i <= ent; i++)
{
for (n = 2; n <= sqrt(i); n++)
if (!(i % n))
sost = 1;
if (!(sost))
cout << i << "\n";
sost = 0;
}
return 0;
}
Проблема в том, что отдельно проверка вводимого выполняется, но при этом завершается работа программы. Мне же надо, чтобы выводилось сообщение об ошибке и можно было бы повторить ввод. В случае добавления данного условия к оператору while просто циклически выводится сообщение без возможности ввести что-либо. Что я сделал не так?
1) Оператор бинарного сдвига в C++ разве отсутствует (я про то, что 2 в степени
n можно записать как 1<<n, не привлекая абсолютно ненужную и к тому же
неточную pow).
2) Вы читали man isdigit? Эта функция проверяет, является ли символ
цифрой. isdigit(ent)=1 ⇔ '0'≤ent≤'9' || 'a'≤ent≤'f' || 'A'≤ent≤'F'.
[b}ZyX[b], 1)с побитовым сдвигом пока не разобрался, так что использовал то, что знаю.
2) То о чем вы написали, является функцией isxdigit, и она действительно проверяет 16-ричные числа. Но у меня осуществлялась проверка десятичных чисел, поэтому использовал isdigit.
NickLion, спасибо за ссылку, попробую реализовать.
Но главный вопрос остается в силе: как сделать, чтобы после проверки вводимого на корректность символов программа не завершалась, а повторно запрашивала число?
[b}ZyX[b], 1)с побитовым сдвигом пока не разобрался, так что использовал то, что знаю.
2) То о чем вы написали, является функцией isxdigit, и она действительно проверяет 16-ричные числа. Но у меня осуществлялась проверка десятичных чисел, поэтому использовал isdigit.
NickLion, спасибо за ссылку, попробую реализовать.
Но главный вопрос остается в силе: как сделать, чтобы после проверки вводимого на корректность символов программа не завершалась, а повторно запрашивала число?
Да, перепутал (в man isdigit куча других функций, а isxdigit самая выделяющаяся
из-за строчки из жирных зелёных чисел). Но суть осталась: '0'≤ent≤'9'.
А cin<<ent запишет в ent число, полученно из стандартного ввода: если
в стандартном вводе "0", то cin запишет в ent 0, а 0<'0'. Что isdigit, что
isxdigit предназначены для символов.
[b}ZyX[b], 1)с побитовым сдвигом пока не разобрался, так что использовал то, что знаю.
2) То о чем вы написали, является функцией isxdigit, и она действительно проверяет 16-ричные числа. Но у меня осуществлялась проверка десятичных чисел, поэтому использовал isdigit.
NickLion, спасибо за ссылку, попробую реализовать.
Но главный вопрос остается в силе: как сделать, чтобы после проверки вводимого на корректность символов программа не завершалась, а повторно запрашивала число?
Да, перепутал (в man isdigit куча других функций, а isxdigit самая выделяющаяся
из-за строчки из жирных зелёных чисел). Но суть осталась: '0'≤ent≤'9'.
А cin<<ent запишет в ent число, полученно из стандартного ввода: если
в стандартном вводе "0", то cin запишет в ent 0, а 0<'0'. Что isdigit, что
isxdigit предназначены для символов.
Зачем проверять символы, когда нужно проверять число?
Прогнал программу в дебаггере, и заметил следующее: в участке кода
Код:
while (ent < 0 || ent > pow(16, sizeof(int)) || (!isdigit(ent)))
{
cout << "Ошибка: введите правильное число\nПопробуйте снова :";
cin >> ent;
}
почему-то не отрабатывает функция cin, т.е бесконечно выводится сообщение, хотя кусок
Код:
if (!isdigit(ent))
{
cout << "Ошибка: это не число";
return 1;
}
отрабатывает на ура. Пробовал вводить разные сочетания букв и цифр, сбоев не обнаружил. Почему не срабатывает cin, понять не могу, программа его просто проскакивает.