Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Unicode
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 4
#1

Проверка типа - C++

01.04.2009, 18:28. Просмотров 2455. Ответов 13
Метки нет (Все метки)

C++
1
2
int n;
std::cin >> n;
Как проверить тип введённых данных? Ведь если введено не int, то программа будет работать не так, как мне нужно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
БурундукЪ
9531 / 2528 / 66
Регистрация: 17.02.2009
Сообщений: 10,364
01.04.2009, 18:40     Проверка типа #2
isInt() - функция проверки для типа int
типа
C++
1
if isInt(n) {......}
Unicode
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 4
01.04.2009, 18:51  [ТС]     Проверка типа #3
А к какой библиотеке относится isInt?
БурундукЪ
9531 / 2528 / 66
Регистрация: 17.02.2009
Сообщений: 10,364
02.04.2009, 09:45     Проверка типа #4
<ctype.h>

Добавлено через 1 минуту 17 секунд
C++
1
if (isdigit(n))  {...}
так правильнее будет
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
02.04.2009, 11:44     Проверка типа #5
Не совсем понимаю, как эта проверка будет работать, ведь в переменную так или иначе будет что-то записано и это что-то будет иметь тип инт, так как переменная объявлена как инт. и даже если вообще ничего не записано, от этого тип переменной не изменится. Или я не прав?
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,908
02.04.2009, 12:17     Проверка типа #6
Цитата Сообщение от Deicider Посмотреть сообщение
Не совсем понимаю, как эта проверка будет работать, ведь в переменную так или иначе будет что-то записано и это что-то будет иметь тип инт, так как переменная объявлена как инт. и даже если вообще ничего не записано, от этого тип переменной не изменится. Или я не прав?
Прав.
Alligieri
CEO
Эксперт C++
2248 / 1237 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
02.04.2009, 19:38     Проверка типа #7
Цитата Сообщение от Бурундук Посмотреть сообщение
<ctype.h>

Добавлено через 1 минуту 17 секунд
C++
1
if (isdigit(n))  {...}
так правильнее будет
Насколько я помню для данной функции надо делать посимвольную проверку. Ответом на вопрос это будет только если сравнивать все введенные символы и 1 всередине будет не цифра, тогда число предположительно не целое
(например 1234.5678:
1 - цифра
2 - цифра
3- цифра
4- цифра
. - не цифра
5 - цифра
6 - цифра и т.д.)
Вот такую проверку можно сделать. А в целом тип сам обрежет ввод под целое число и прога проработает коректно, но результат пользователь получит не тот что хотел (ну тут как говорится как застелили так и выспались, надо предупреждения про диапазоны ввода выводить на екран).
stels
2 / 1 / 0
Регистрация: 02.04.2009
Сообщений: 28
02.04.2009, 20:37     Проверка типа #8
"А в целом тип сам обрежет ввод под целое число и прога проработает...."А якщо паралельно змінну записати ше в змінну типу float і порівняти!
C++
1
2
3
4
5
float a; int b;
cout<<"введем число"; cin>>a;
b=a;
 if(a==b) \\хай валяє
  else  \\виводимо повідомлення
Alligieri
CEO
Эксперт C++
2248 / 1237 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
02.04.2009, 21:19     Проверка типа #9
Цитата Сообщение от stels Посмотреть сообщение
"А в целом тип сам обрежет ввод под целое число и прога проработает...."А якщо паралельно змінну записати ше в змінну типу float і порівняти!
C++
1
2
3
4
5
float a; int b;
cout<<"введем число"; cin>>a;
b=a;
 if(a==b) \\хай валяє
  else  \\виводимо повідомлення
Неплохой вариант, но вот число 11.0000001 в формате float воспринимается так же как и int. Конечно можно всегда стараться опережать такую ситуацию и задавать более длинные типы, но способ унифицырованным не назвешь но все равно хорош для многих задач
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
03.04.2009, 13:47     Проверка типа #10
Цитата Сообщение от Deicider Посмотреть сообщение
Не совсем понимаю, как эта проверка будет работать, ведь в переменную так или иначе будет что-то записано и это что-то будет иметь тип инт, так как переменная объявлена как инт. и даже если вообще ничего не записано, от этого тип переменной не изменится. Или я не прав?
не совсем, если введенное значение будет начинаться не с цифры(а например с буквы или с точки и т.д.), то переменная ничего не получит - проверенно
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
03.04.2009, 14:17     Проверка типа #11
Цитата Сообщение от kazak Посмотреть сообщение
если введенное значение будет начинаться не с цифры(а например с буквы или с точки и т.д.), то переменная ничего не получит - проверенно
Я и говорю:
и даже если вообще ничего не записано, от этого тип переменной не изменится
Так что описанная проверка не катит.

Вот это предложение самое дельное было:
C++
1
2
3
4
5
float a; int b;
cout<<"введем число"; cin>>a;
b=a;
 if(a==b) \\хай валяє
  else  \\виводимо повідомлення
Неплохой вариант, но вот число 11.0000001 в формате float воспринимается так же как и int. Конечно можно всегда стараться опережать такую ситуацию и задавать более длинные типы, но способ унифицырованным не назвешь но все равно хорош для многих задач
Ну это уже вопрос не типа, а ограничения на длину переменной.
YurA_280784
Заблокирован
03.04.2009, 14:33     Проверка типа #12
Чего не сделать вот так
C++
1
2
3
4
5
6
7
8
9
10
11
char chBuf[256];
cin>>chBuf;
int i;
while(chBuf[i] != '\0' && isdigit(chBuf[i]))
 i++;
if(i < strlen(chBuf) - 1)
 cout<<"Vvedeno ne chislo\r\n";
else
{
     //Делаем всё то если chBuf число...
}
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
03.04.2009, 14:52     Проверка типа #13
Цитата Сообщение от YurA_280784 Посмотреть сообщение
Чего не сделать вот так ...
Только перед тем, как что-то делать дальше, нужно из символьного chBuf получить int:

C++
1
2
3
4
5
6
7
8
int x=0;
for (int i = strlen(chBuf) - 1; i > 0;  i--)
{
if (i > 1)
    x += (chBuf[i] - 48) * 10 * (i-1); // 48  - это ASCII код нуля.
else
    x += (chBuf[i] - 48); 
}
И всё это удовольствие работает только для беззнаковых. Если ввести минус, то не пройдет проверка isdigit.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2009, 15:36     Проверка типа
Еще ссылки по теме:

Проверка правильности ввода для переменной типа short C++
C++ Проверка существования трехугольника с заданными сторонами, и определение его типа
C++ Проверка вводимых данных на соответствие типа
Можно ли присвоить объекту основного типа значение объекта пользовательского типа? C++
Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа C++

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

Или воспользуйтесь поиском по форуму:
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.04.2009, 15:36     Проверка типа #14
C++
1
2
3
4
5
    int val;
    std::cin>>val;
    char ch;
    if (!std::cin.good()||(std::cin.get(ch) && ch!='\n'))
        std::cout<<"Error!\n";
Yandex
Объявления
03.04.2009, 15:36     Проверка типа
Ответ Создать тему
Опции темы

Текущее время: 23:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru