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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 118, средняя оценка - 4.87
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
#1

Проверка на правильность ввода с клавиатуры - C++

23.10.2012, 12:12. Просмотров 22012. Ответов 30
Метки нет (Все метки)

Здравствуйте!
задача: пользователь вводит с клавиатуры цифру, нужно проверить что пользователь действительно ввел цифру, а не букву, знак или сочетание вышесказанного (db, 24d, 2k5)

вот на чем я остановился

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
bool exit;
 
cin>>n;
exit=true;
while(exit){
    if((n>'a' || n<'Z')) {
           cout<<"ne verno vveli, povtorite vvod - \n";
               cin<<n;
           exit=true;
    }
    else {exit=false;}
}
я только сейчас начал понимать, что я проверяю не посимвольно, а целиком весь num
может кто то сталкивался?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2012, 12:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на правильность ввода с клавиатуры (C++):

Проверка на правильность ввода C++ - C++
Приветствую Возник вопрос, написал небольшую программку для вычисления корней квадратного уравнения. Проверки все работают. Остается...

Проверка на правильность ввода значения. - C++
Вот пишу так называемую &quot;проверку на дурака&quot;. Столкнулся с проблемой, код: { double ch; int y=0; do{ y=1; int q=0; int...

Проверка ввода с клавиатуры в функции - C++
Перешел к изучению пользовательских функций и столкнулся с проблемой : проверка ввода числа с клавиатуры работает некоректно. Вот Фукция и...

Правильность ввода даты - C++
Всем привет. Хотелось бы узнать способ проверки правильности формата введенной даты в строке. Т.е. на вход подается строка, необходимо...

Проверить массив на правильность ввода - C++
Вроде бы были похожие темы, но так как я тупой, то не смог подобрать подходящего решения. Задача такова: хочу заполнить массив с...

Как контролировать правильность ввода? - C++
В переменные типов unsigned и double нужно записать численное значение. Какие есть способы контроля ввода для избежания ввода символов,...

30
HarryFranc
2 / 2 / 2
Регистрация: 16.10.2012
Сообщений: 69
23.10.2012, 16:29 #2
пробуй функцию atoi();
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
24.10.2012, 05:43 #3
HarryFranc, atoi в случае некорректного аргумента тихо-мирно вернет 0, так что не подходит.

Петр1, можно считывать в строку и разбирать ее содержимое.
1
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 1
24.10.2012, 05:56 #4
Цитата Сообщение от Nameless One Посмотреть сообщение
можно считывать в строку и разбирать ее содержимое.
А если проверить состояние потока cin после ввода? Ведь если невозможно прочитать данные из потока в переменную типа int, то будет выставлен флаг fail (или bad, в любом случае cin.good()==false)
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
24.10.2012, 06:02 #5
Croessmah, при этом во входном потоке останется мусор, и для того, чтобы последующее чтение прошло корректно, нужно этот мусор убрать, что делается не очень очевидным образом.

А разбирать содержимое строки точно так же методами классов stringstream, проверяя те же выставляемые флаги на предмет ошибки.
0
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 12:07  [ТС] #6
Добрый день!
Вот что получилось:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
exit=true;
while(exit){
    gets(name);
    for(int j=0; name[j]!='\0'; j++){
        if(j>1 || name[j]<'0' || name[j]>'9'){cout<<"povtoritb vvod\n"; exit=true; break;}
        else if(j<2 && name[j+1]=='\0') {
            int n1, n2; 
            if(name[0]!='\0') n1=name[0]; n1=(n1-48)*10;
            if(name[1]!='\0') n2=name[1]; n2-=48;
            ar1[i].day=n1+n2; exit=false;
                }
    }
}
работает, но мне кажется что можно легче сделать, здесь нужно проверять на ввод до 2-х цифр, а дальше мне нужно проверять 4 цифры, после чего еще нужно будет вводить 9 цифр, и самое неприятное эти 9 цифр могут плавать в диапазоне от 5 до 9
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
24.10.2012, 12:27 #7
Не стоит использовать gets. Лучше использовать fgets.

Разбор строки не нужно делать вручную, можно воспользоваться strtod или sscanf:

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
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
int main(void)
{
    char buf[BUFSIZ];
    char junk;
    int number;
    bool ok = false;
 
    while(!ok)
    {
        fputs("Enter a number: ", stdout);
        fflush(stdout);
 
        if(fgets(buf, BUFSIZ, stdin) == NULL)
        {
            if(!ferror(stdin))
            {
                fputs("No input available\n", stderr);
                exit(EXIT_FAILURE);
            }
            else
            {
                perror("stdin");
                clearerr(stdin);
                continue;
            }
        }
 
        if(sscanf(buf, "%d %c\n", &number, &junk) != 1)
        {
            fputs("Incorrect input\n", stderr);
            continue;
        }
 
        ok = true;
    }
 
    printf("You've entered %d\n", number);
 
    exit(EXIT_SUCCESS);
}
Если использовать C++, а не C, то идея та же. Сначала мы считываем ввод в строку, затем инициализируем этой строкой строковый поток, из которого уже производим чтение числа. Если при чтении не установились флаги ошибки потока, то ввод произошел успешно, в противном случае его нужно повторить.
2
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 14:22 #8
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
#include <iostream>
using namespace std;
 
int main() 
{
int n = 0;
while(true)
{
    cout << "Vvedite chislo: ";
    cin >> n;
    if(!cin) 
    {
       cout << "ne verno vveli, povtorite vvod\n";
       cin.clear();
       while (cin.get() != '\n');
    }
    else break;
 }
 
 cout << n << endl;
    
 system("pause");
 return 0;
}
1
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 14:36  [ТС] #9
C
1
2
fputs("Enter a number: ", stdout); // Функция fputs копирует строку, ограниченную нулевым         байтом  в  поток  stream.
fflush(stdout); //Функция fflush записывает в файл содержимое буфера, связанного с потоком stream,
Вот здесь проверка на правильность ввода, что можно ввести чтобы не пройти проверку?
C
1
2
3
4
5
6
7
8
9
10
11
           if(!ferror(stdin))
            {
                fputs("No input available\n", stderr);
                exit(EXIT_FAILURE);
            }
            else
            {
                perror("stdin");
                clearerr(stdin);
                continue;
            }
а как работает эта часть я не понял
Функция sscanf просматривает входные поля, символ за символом.
buf - это то что мы смотрим символ за символом

C
1
2
3
4
5
6
    
    if(sscanf(buf, [COLOR="Red"]"%d %c\n", &number, &junk[/COLOR]) != 1)
        {
            fputs("Incorrect input\n", stderr);
            continue;
        }
0
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
24.10.2012, 14:58 #10
А чего б не использовать функцию isdigit...
C++
1
2
3
4
5
6
7
8
char ch, mass[20] = {0};
    int res, i = 0;
    while((ch=getch()) != 13) {
        if(isdigit(ch)) mass[i++] = ch;
        else {}
    }
    mass[i] = '\0';
    res = atoi(mass);
Если i = 0 значит ничего не было введено. Как обрабатывать ошибки это другой вопрос и можно как угодно
0
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 16:02  [ТС] #11
Цитата Сообщение от denys_l Посмотреть сообщение
А чего б не использовать функцию isdigit...
угодно
Немного не то, хотя тоже вариант. Дело в том что пользователь должен видеть то что вводит.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 16:15 #12
Вот код, который даже не выводит на экран, если это не цифра (или не знак числа перед цифрой):
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
#include "conio.h"
#include "stdio.h"
 
int GetInt()
{
   int k,n=0,flgS=0,c=0,q=0;
 
    while (1)
   {
 
        k=getch();
        
        if ((k == '-') && (c == 0) && (flgS == 0)) 
       {
          flgS=-1;
          putch('-');
          c++;
       }
 
       if ((k >= '0') && (k <= '9')) 
       {
           printf("%c",k);
           n=n*10+k-'0';
           c++;
           q++;
       }
     
       if (k == 8)
       {
           
           putch(8);
           putch(' ');
           putch(8);
           n=n / 10;
           q--;
           if (q < 0) q=0;
           c--;
           if (c < 0) {flgS=0; c = 0;}
       }
 
       if ((k == 13) && (c != 0) && (q != 0)) break;
 
    }
 
    if (flgS == -1) n=-n;
    return n;
}
 
int main(int argc, char* argv[])
{
 
    int m;
 
    m=GetInt();
    printf("\nYou have inputed: %d\n",m);
    getch();
    return 0;
 
}
1
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
24.10.2012, 16:23 #13
Цитата Сообщение от Петр1 Посмотреть сообщение
Немного не то, хотя тоже вариант. Дело в том что пользователь должен видеть то что вводит.
можно добавить cout << каждый раз при вводе. В любом случае при первой нецифре нас бросит в else. Там можно вывести сообщение о неверном вводе, выйти из цикла, обнулить счетчик, запросить желание набора ещё раз и в случае согласия пробовать ещё
0
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 16:25  [ТС] #14
ого, круто.
подскажите пожалуйста где почтитать про %d %s %c и тд. я не могу понять как этим выражением пользоваться.
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
24.10.2012, 16:29 #15
alsav22, cin.clear по стандарту не очищает входной поток, а всего лишь сбрасывает установленные флаги. Для этого лучше использовать метод ignore, но и у него есть свои недостатки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2012, 16:29
Привет! Вот еще темы с ответами:

Проверить правильность ввода в строке типа char - C++
Здравствуйте. Такой вопрос: Есть строковый массив и запись в него, но как при этом проверить все это дело на содержание в нем, либо при...

циклические алгоритмы (проверять правильность ввода данных) - C++
С клавиатуры вводят дробные числа, до тех пор пока их сумма меньше К. Число К вводится с клавиатуры и лежит в диапазоне от 0 до 1000....

проверка кода на правильность - C++
Используя оператор цикла while с условием и постусловием, решить следующие задачу: найти сумму ряда с точностью е = 10-4, общий член...

Проверка на правильность кода - C++
// C++ 6.6 I.12.cpp : Defines the entry point for the console application. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
24.10.2012, 16:29
Ответ Создать тему
Опции темы

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