Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/425: Рейтинг темы: голосов - 425, средняя оценка - 4.78
3 / 3 / 0
Регистрация: 18.03.2009
Сообщений: 20

Проверка типа вводимой переменной

18.03.2009, 00:34. Показов 78447. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сабж. Консольный режим.
Возможно ли это вообще? Преобразование типов канечн рулезная вещь.

Вот в таком кусочке:
C++
1
2
cout << "Введите число";
int a = cin.get();
Как запретить считывание всего кроме int?
Нужно просто прочитать введенное с клавиатуры целое число. И чтоб ругался при вводе символов и чисел с запятой.

Заранее благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2009, 00:34
Ответы с готовыми решениями:

Проверка типа вводимой переменной
Как в этом кусочке кода записать так, чтобы вводилась только переменная типа int, иначе &quot;повторите ввод&quot; struct Weather...

Проверка типа переменной на этапе компиляции
Добрый день. Прошу экспертов( ну или всех, кто это знает ) показать, как правильно &quot;повешать&quot; проверку времени компиляции на то,...

Проверка правильности ввода для переменной типа short
Как проверить, введённые числа в диапазоне Short или нет? Если я ввожу -32769, программа закрывается... int main() { short a, b, x,...

10
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
18.03.2009, 01:57
Запретить ты никак не можешь. Пользователь может вводить в консоли любые символы.
Вводи строку, проверяй ее, если верно - конвертить в нужный тип.
0
3 / 3 / 0
Регистрация: 18.03.2009
Сообщений: 20
18.03.2009, 13:43  [ТС]
спасибо за попытку ответить.

Нашел я решение: с помощью функции isdigit посимвольно проверить весь ввод.
0
 Аватар для snakext
6 / 6 / 2
Регистрация: 08.06.2010
Сообщений: 35
08.06.2010, 16:30
Извиняюсь что поднимаю старую тему, но вопрос у меня практически такой же, а именно:
Как сделать так, чтобы при вводе переменной типа int, выводились только целые числа, если же вводим число с запятой выдает надпись, что было введено не целое число.
Пробовал через деление с остатком - не получилось.
0
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
08.06.2010, 17:21
Лучший ответ Сообщение было отмечено как решение

Решение

можно попробовать так в цикле пока не будет то что нужно
C++
1
2
3
4
5
6
7
8
int number;
cin >> number;
if (!cin)
{
cout << “Input Error!<< endl;
cin.clear();
fflush(stdin);
}
3
 Аватар для snakext
6 / 6 / 2
Регистрация: 08.06.2010
Сообщений: 35
08.06.2010, 19:35
Этот цикл выдает ошибку, если ввел не цифры, а буквы. В случае с дробными цифрами, он выводит целую часть. Как бы сделать, чтобы он на дробные цифры выдавал такую же ошибку, как на буквы ?
0
3 / 3 / 0
Регистрация: 18.03.2009
Сообщений: 20
10.06.2010, 11:34  [ТС]
Если isdigit'ом делать, то вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
  char str[4]="1.2";
  bool err = true;
  for(int i = 0; i < 3; i++)
  {
      if (!isdigit(str[i]))
      {
        err = false;
        break;
      }
  }
  if (err) printf ("Ok");
    else printf ("Error");
1
37 / 37 / 2
Регистрация: 13.05.2010
Сообщений: 81
10.06.2010, 12:52
Цитата Сообщение от snakext Посмотреть сообщение
Этот цикл выдает ошибку, если ввел не цифры, а буквы. В случае с дробными цифрами, он выводит целую часть. Как бы сделать, чтобы он на дробные цифры выдавал такую же ошибку, как на буквы ?
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
#include <iostream>
using namespace std;
char ch='1';
int ii=0, iii=255;
//bool zz=false;
//void um (float*,char*);
//void ckobki(float*,char*);
//void znaki (float*,char*);
int main ()
{   int i=1;
    bool otvet=false;
    float  *a=new float[256];
    char *l=new char[256],  ch;
    for (int i=0; i<256; i++) {a[i]=0; l[i]='$';}l[0]='+'; 
    while(i+1){
    cin.get(ch);
    if (ch=='\n') break;    
    /*if (ch=='(')  {a[i]=1;l[i+1]='*'; l[i+2]=ch; i+=3;}
    if (ch==')')    {l[i]=ch;i++;}
    if (ch=='-')    {l[i]=ch;i++;}
    if  (ch=='+')   {l[i]=ch;i++;}
    if (ch=='*')    {l[i]=ch;i++;}
    if  (ch=='/')   {l[i]=ch;i++;}*/
    switch (ch){
        case '0':   case '5':   
        case '1':   case '6':
        case '2':   case '7':
        case '3':   case '8':
        case '4':   case '9':
        
            cin.putback(ch);
            cin>>a[i];i++; } }
 
    float z=a[1]/(int)a[1];
    if (z==1) 
 
    cout<<a[1];
return 0;}
кусок кода выдрал (пардон)

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main ()
{   float  a=0;
    char   ch;
     
    while(1){
    cin.get(ch);
    if (ch=='\n') break;    
    switch (ch){
        case '0':   case '5':   
        case '1':   case '6':
        case '2':   case '7':
        case '3':   case '8':
        case '4':   case '9':
        
            cin.putback(ch);
            cin>>a; }}
 
    float z=a/(int)a;
    if (z==1) cout<<a; else cout<<"error";
 
    return 0;}
удалил ненужное

Добавлено через 17 минут
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
#include <iostream>
using namespace std;
int main ()
{   float  a=0;
    char   ch;
    int i=0;
     
    while(1){
    cin.get(ch);
    if (ch=='\n') break;    
    switch (ch){
        case '0':   case '5':   
        case '1':   case '6':
        case '2':   case '7':
        case '3':   case '8':
        case '4':   case '9':
        
            cin.putback(ch);
            cin>>a; i++;}}
    if (a==0 && i>0) cout<<a; else {
 
    float z=a/(int)a;
    if (z==1) cout<<a; else cout<<"error";}
 
    return 0;}
извечный нолик добавили к типу)))
1
 Аватар для FireNovel
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
10.06.2010, 13:14
Лучший ответ Сообщение было отмечено как решение

Решение

Ввод только целых чисел:
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
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
 
int main()
{
    int c, num, i = 0;
    char str[80];
    while ( ( c = _getch()) != 13 ) /* 13  - keys ENTER */
    {
        if ( isdigit( c ) /* || c == '.'*/  ) //раскоментируй для ввода десятичного разделителя 
        {
            str[i++] = (char) c; 
            _putch( c );
        }
    }
    str[i] = '\0'; 
 
    num = atoi( str );
 
    printf( "\nnum = %d\n", num );
 
    system("PAUSE");
    return 0;
}
Можно сделать (если не цифра то) печатать сообщение об ошибке
Ну, это не суть важно
3
Alexandrq
17.05.2013, 22:15
Цитата Сообщение от FireNovel Посмотреть сообщение
Ввод только целых чисел:
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
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
 
int main()
{
    int c, num, i = 0;
    char str[80];
    while ( ( c = _getch()) != 13 ) /* 13  - keys ENTER */
    {
        if ( isdigit( c ) /* || c == '.'*/  ) //раскоментируй для ввода десятичного разделителя 
        {
            str[i++] = (char) c; 
            _putch( c );
        }
    }
    str[i] = '\0'; 
 
    num = atoi( str );
 
    printf( "\nnum = %d\n", num );
 
    system("PAUSE");
    return 0;
}
Можно сделать (если не цифра то) печатать сообщение об ошибке
Ну, это не суть важно
Подскажите пожалуйста!
Вопрос 1.
В этом примере из строки достают число типа int. Причем слова вводить нельзя.
Как float достать из str[i]?

Вопрос 2.
Как выглядит проверка ввода "да\нет"?
Чтобы можно было вводить только символы.
А потом проверить, что ввел, ну и дальше там код писать какой надо.
1 / 1 / 0
Регистрация: 17.10.2016
Сообщений: 3
17.10.2016, 17:27
Вот эта штука работает)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
 
using namespace std;
 
int main()
{
    int a;
    cin >> a;
    if (cin.get() == (int) '\n')
        cout << a << endl;
    else
        cout << "error" << endl;
    system("pause");
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2016, 17:27
Помогаю со студенческими работами здесь

Определять тип вводимой переменной (char или int)
Вообщем изначально дали задание определять тип вводимой переменной (char или int ). Это я выполнил,затем изменили задание, нужно сделать...

Переменной d присвоить первую цифру после запятой некоторой переменной x типа float
Нужно целой переменной d присвоить первую цыфру после комы некоторой переменной x типа float Скажите, пожалуйста, с чего начать и по...

Записать адрес переменной произвольного типа в переменную типа int
Здравствуйте, есть структура __packed struct myStruct{ uint32 HisCh; uint32 sNo; uint16 tNo; uint32 reserv; };

Нужно посчитать сумму положительных элементов кратных 2.причём началом этого масивва является не нулевой индекс,а значение ранее вводимой переменной р
s=0; for(i=p; i&lt;=n;p++) if(a&gt;0 &amp;&amp; a%2==0) s+=a; cout&lt;&lt;&quot;Summa polozhitelnih elementov kratnih 2 =&quot;...

Как присвоить значение одного из элементов массива типа char переменной типа int?
С++ начал буквально только что так что буду благодарен за терпение и понимание ) Сразу оговорюсь что уже искал ответ но на эту тему...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru