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

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

Восстановить пароль Регистрация
 
Joker_94
0 / 0 / 0
Регистрация: 11.09.2013
Сообщений: 11
08.10.2013, 01:13     Запрет на ввод с клавиатуры #1
Можно ли сделать так, чтобы вводить с клавиатуры можна было только один тип данных, (инт например), чтобы при вводе чаровских данных програма не уходила в астрал, а выдавала, ошибка, неверный ввод, введите еще раз (или что то подобное) Визуал студия 2010 експрес

Вот програмка, нужно сделать так, чтобы такая ошибка писалась если в поле "Введите посiвну площу(га)" и "Введите врожайность(ц/га)" вводились буквы програма не уходила в астрал, а просто ругалась, и работала дальше!!
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
using namespace std;
struct office_t
{
    std::string name, type;
    double plocha;
    double vrozh;
};
 
int main()
{  setlocale(LC_ALL, "Russian");
 
    vector<office_t> table;
 
    office_t in;
 
    while( 1 )
    {
        cout << "Введите имя с/г культири:(або закiнчити введення,введите END): ";
        cin >> in.name;
 
        if( in.name == "END")
        {
            break;
        }  
 
        cout << "Введите тип: ";
        cin >> in.type;
 
        cout << "Введите посiвну площу(га): ";
        cin >> in.plocha;
 
        cout << "Введите врожайность(ц/га): ";
        cin >> in.vrozh;
 
        cout << '\n';
 
        table.push_back( in );
 
    }
    
 system("cls");
 cout<<"                  Сільськогосподарські культури"<<"\n";
    cout << "\n\nНайменування\tТип\tПосiвна площа(га)\tВрожайность(ц/га)е\n-------------------------------------------------------------\n";
    for( size_t i = 0; i < table.size(); i++ )
    {
             cout << table[i].name <<"      "<< '\t'
                  << table[i].type <<"     "<< '\t'
                  << table[i].plocha<<"     "<< '\t'
                 <<"          " << table[i].vrozh <<"   "<< '\n';
             getch();
    }
    cout<<"-------------------------------------------------------------"<<"\n";
    cout<<"З-зерновi"<<"\n";
    cout<<"Б-бобовi"<<"\n";
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2013, 01:13     Запрет на ввод с клавиатуры
Посмотрите здесь:

ЗАПРЕТ на ввод Б У К В Ы ... ... ... C++
Запрет на ввод букв в консоли на C++ C++
C++ Ввод в консоле только чисел(запрет ввода других символов)
C++ ввод с клавиатуры
C++ Ввод с клавиатуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
08.10.2013, 01:29     Запрет на ввод с клавиатуры #2
Как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    int x;
    bool correct;
    do
    {
        correct = true;
        std::cout << "Enter x: ";
        std::cin >> x;
        if (std::cin.fail())
        {
            correct = false;
            std::cin.clear();
            std::cin.sync();
            std::cout << "Incorrect, expected int\n\a";
        }
    } while (!correct);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <cstdlib>
 
bool isDigit(const std::string &str)
{
    return std::all_of(str.begin(), str.end(), isdigit);
}
 
int main()
{
    std::string str;
    do
    {
        std::cin >> str;
    } while (!isDigit(str));
    int x = std::atoi(str.c_str());
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.10.2013, 02:07     Запрет на ввод с клавиатуры #3
В строке ввода только цифры, перед которыми могут быть + или - :
C++
1
2
3
4
5
6
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
30.10.2013, 08:39     Запрет на ввод с клавиатуры #4
Joker_94, вот здесь еще почитайте: Безопасный ввод через функцию-шаблон.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
30.10.2013, 09:38     Запрет на ввод с клавиатуры #5
SatanaXIII, не разъясните один момент?
В коде имеем:
C++
1
!(cin>>val)
Посмотрел описание операции >>. Таки все понятно она перегруженна:
C++
1
2
      __istream_type& 
      operator>>(int& __n);
Вот тут и возник вопрос. А что возвращает эта операция? Насколько я понимаю если не удается преобразовать данные из буфера в тип int операция возвращает 0. Это верно?
Если все прошло успешно, возвращается ссылка на шаблонный класс как опредленно в том же заголовочнике:
C++
1
      typedef basic_istream<_CharT, _Traits>        __istream_type;
Можно ли где-нибудь посмотреть на реализацию operator>>(int&)?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2013, 09:52     Запрет на ввод с клавиатуры #6
Ilot, Нет, в любом случае возвращается ссылка на istream. Просто у istream есть operator void* ().
http://en.cppreference.com/w/cpp/io/.../operator_bool
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
30.10.2013, 10:10     Запрет на ввод с клавиатуры #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Ilot, Нет, в любом случае возвращается ссылка на istream.
Как бы понятно. Я имел ввиду, что возвращается указатель на NULL.
Получается operator bool преобразует указатель возвращаемый операцией в тип bool как того требует конструкция if(...). А operator void* здесь причем? Или сперва возвращаемый тип неявно преобразуется к void*, а уж затем выполняется operator bool?
Хотя вижу мои рассуждения несколько глупы...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2013, 10:22     Запрет на ввод с клавиатуры #8
Ilot, Еще раз. При возврате из оператора возвращается в любом случае ссылка на istream. При использовании в булевом контексте ищется возможность приведения. До С++11 был operator void*(), в текущем стандарте (C++11) есть explicit operator bool(). void* имеет возможность приводиться неявно к bool.
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a
prvalue of type bool
. A zero value, null pointer value, or null member pointer value is converted to false;
any other value is converted to true.
Таким образом, при использовании istream в условном операторе вызывается operator void*, который возвращает void* (нулевой указатель, если istream.fail()), после чего данный указатель конвертируется в bool.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2013, 10:29     Запрет на ввод с клавиатуры
Еще ссылки по теме:

C++ Запрет на ввод букв
Как реализовать запрет на ввод в консоли? C++
C++ Запрет на ввод спецзнаков

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
30.10.2013, 10:29     Запрет на ввод с клавиатуры #9
Зараза для оператора operator void* не заметил until. И подумал же почему эти два оператору вдруг определенны только для C++11
ForEveR, еще раз спасибо.
Yandex
Объявления
30.10.2013, 10:29     Запрет на ввод с клавиатуры
Ответ Создать тему
Опции темы

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