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

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

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

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

23.10.2012, 12:12. Просмотров 24492. Ответов 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
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
24.10.2012, 16:30 #16
Цитата Сообщение от Петр1 Посмотреть сообщение
ого, круто.
подскажите пожалуйста где почтитать про %d %s %c и тд. я не могу понять как этим выражением пользоваться.
Прохоренок 1 глава, 18 стр.
Ввод данных в языке С. Это форматированный ввод данных. Токо зачем оно тебе не пойму
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 16:33 #17
Цитата Сообщение от Nameless One Посмотреть сообщение
alsav22, cin.clear по стандарту не очищает входной поток, а всего лишь сбрасывает установленные флаги. Для этого лучше использовать метод ignore, но и у него есть свои недостатки.
Вы насчёт кода в 8 посте? Так я там cin.clear() и использую для сброса флага ошибки. Очистку потока там это делает:
C++
1
 while (cin.get() != '\n');
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.10.2012, 16:34 #18
Цитата Сообщение от Петр1 Посмотреть сообщение
Вот здесь проверка на правильность ввода, что можно ввести чтобы не пройти проверку?
Здесь проверка лишь на то, что ввод строки произошел успешно.

Цитата Сообщение от Петр1 Посмотреть сообщение
а как работает эта часть я не понял
Тут уточняется, что стало причиной неудачного ввода: конец файла или ошибка ввода.



Цитата Сообщение от Петр1 Посмотреть сообщение
Функция sscanf просматривает входные поля, символ за символом.
buf - это то что мы смотрим символ за символом
http://www.opennet.ru/man.shtml?topic=scanf&category=3&russian=0

Тут проверяется, что в введенной строке содержится именно число и что после этого числа нет никакого «мусора». Ну и параллельно считывается это число из строки.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 16:36 #19
Вот ещё один вариант того же:
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
60
61
62
63
64
65
66
//Вводятся только числа.
 
#include "conio.h" // для getch().
#include <iostream>
#include <string>
#include <sstream> // для stringstream.
using namespace std;
 
int main()
{
  int n = 0, flgS = 0, c = 0, q = 0; 
  unsigned char k = 'a'; // переменная для ввода.
  string str;      // строка для цифр и минуса.
 
 
   
    while (k != '|')
   {
        k = getch(); // ввод без отображения.
        if (k == '|') break;
        
        if ((k == '-') && (c == 0) && (flgS == 0)) // если символ минус, и число символов 0, 
                                                   //и минус ни разу не отображался (флаг 0).
       {
          flgS=-1; // если отображается минус.
          cout << '-';      // отображаем минус.
          str.push_back(k); // минус помещаем в строку.
          c++;              // число символов.
       }
        
        if ((k >= '0') && (k <= '9')) // если символ цифра.
       {
           cout << k;        // отображаем цифру.
           str.push_back(k); // символ в строку.
           c++;              // число символов.
           q++;              // число цифр.
       }
     
       if (k == '\b' && c != 0) // если backspace и число символов не 0.
       {
           cout << '\b'; // курсор на шаг назад.
           cout << ' ';  // затираем последий символ.
           cout << '\b'; // курсор на шаг назад.
           if (!str.empty()) // если строка не пуста, 
              str.pop_back(); // то извлекаем один.
           q--;            // число цифр уменьшили.
           if (q < 0) q = 0; // если получили отрицательное значение, то делаем 0. 
           c--;            // число символов уменьшили.
           if (c <= 0)     // если удалённый символ был последним,
           {
                flgS = 0; // обнуляем флаг, чтобы можно было снова отображать минус.
                c = 0;    // количество символов 0.
           } 
       }
 
       if ((k == 13) && (c != 0) && (q != 0)) break; // если, хотя бы, одна цифра введена, то выход. 
 
    }
    stringstream stream(stringstream::in | stringstream::out); // создаётся объект для внутреннего форматирования.
    stream << str; // вводим строку числовых символов.
    stream >> n;   // извлекаем число.
    cout << endl << n << endl;
 
 system("pause");
 return 0;  
}
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.10.2012, 16:44 #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы насчёт кода в 8 посте? Так я там cin.clear() и использую для сброса флага ошибки. Очистку потока там это делает:
Попробуй просто нажать на Enter.

Добавлено через 4 минуты
Вот очень хорошая статья про то, какими способами можно очищать входной поток, и почему эти способы часто не работают.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 16:44 #21
Цитата Сообщение от Nameless One Посмотреть сообщение
Попробуй просто нажать на Enter.
И что? Просто ждёт ввода.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.10.2012, 16:51 #22
alsav22, а у меня зацикливается

Добавлено через 2 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
а у меня зацикливается
хотя нет, я ошибся, все нормально. Если не считать, что ввод типа "2 foo" будет считан нормально.

Добавлено через 3 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
Если не считать, что ввод типа "2 foo" будет считан нормально.
Ну и программа перестает реагировать на EOT
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2012, 17:04 #23
Цитата Сообщение от Nameless One Посмотреть сообщение
Если не считать, что ввод типа "2 foo" будет считан нормально.
Особенности работы cin>>.
Цитата Сообщение от Nameless One Посмотреть сообщение
Ну и программа перестает реагировать на EOT
Имеете ввиду EOF? Зачем, чтобы реагировала?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.10.2012, 17:12 #24
Цитата Сообщение от alsav22 Посмотреть сообщение
Особенности работы cin>>.
Нет, тут cin работает так же, как и сишный scanf.

Цитата Сообщение от alsav22 Посмотреть сообщение
Имеете ввиду EOF? Зачем, чтобы реагировала?
Я имею в виду EOT. Затем, что если пользователь захочет отменить ввод, то программа должна на это корректно реагировать. Или возьмем другую ситуацию. Допустим ввод будет предоставляться не пользователем, а читаться из файла (через перенаправление потоков) либо из конвейера. Программа не сможет никак среагировать на то, что во входном потоке закончились данные.
0
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 17:40  [ТС] #25
так будет правильно?
не намусорю?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    char junk;
    char name[40];
    unsigned int number;
    bool ok = false;
    while(!ok)
    {
        cout<<"Enter a number: ";
        gets(name);
        if(sscanf(name, "%d %c\n", &number, &junk) != 1) {
           cout<<"Incorrect input\n";
            ok=false;
        }
        else {ok = true;}
    }
    cout<<number<<"\n";
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
24.10.2012, 17:44 #26
Не мешайте ввод вывод Си и Си++
0
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 17:51  [ТС] #27
Цитата Сообщение от Croessmah Посмотреть сообщение
Не мешайте ввод вывод Си и Си++
Дело в том, что я пишу на Си, а тему перенаправили в С++ Для меня это не столь важно, я пока не вижу разницы между Си и С++
Если писать на Си, я правильно делаю?
Заранее, спасибо.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
24.10.2012, 17:53 #28
Цитата Сообщение от Петр1 Посмотреть сообщение
Если писать на Си, я правильно делаю?
На Си Ваш код не скомпилируется, ибо cout это удел Си++
1
Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
24.10.2012, 18:00  [ТС] #29
Цитата Сообщение от Croessmah Посмотреть сообщение
На Си Ваш код не скомпилируется, ибо cout это удел Си++
я же говорю, что не вижу разницы.
Перенаправили правильно )
Мой код на С++ правильный? он работает и это точно.
По правилам он написан? ни где мусорить не будет?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
24.10.2012, 18:08 #30
Цитата Сообщение от Петр1 Посмотреть сообщение
По правилам он написан? ни где мусорить не будет?
С натяжкой можно сказать, что да. Но я бы все-таки остановился либо на С, либо на С++, и не смешивал эти языки.
1
24.10.2012, 18:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2012, 18:08
Привет! Вот еще темы с ответами:

Проверить правильность ввода в строке типа 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...


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

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

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