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

Проверка ввода - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.94
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 21:44     Проверка ввода #1
Как ограничить ввод символов в программе!!!! На каждый символ, который был введен выдавать сообщение о неправильном вводе????? Надо чтоб можна было ввести только цифры???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2010, 21:44     Проверка ввода
Посмотрите здесь:

C++ проверка ввода C++
Проверка ввода C++
Проверка ввода C++
C++ Проверка ввода
C++ gets() проверка ввода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
smithy69
17 / 16 / 1
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 21:53     Проверка ввода #2
если ввод по символьный, то просто цикл до какого то числа,а в теле цикла read, потом символ сравниваешь, например simvol>'0' && simvol<'9'. На счёт границ не уверен, посмотри ASCII таблицу.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 22:55  [ТС]     Проверка ввода #3
Никак непойму с условиям!!!
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:00     Проверка ввода #4
Цитата Сообщение от MILAN Посмотреть сообщение
На каждый символ, который был введен выдавать сообщение о неправильном вводе????? Надо чтоб можна было ввести только цифры???
это вопросы?)
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 23:02  [ТС]     Проверка ввода #5
Как ограничить ввод символов в программе??? На каждый символ, который был введен выдавать сообщение о неправильном вводе. Надо, чтоб можна было ввести только цифры!!!!!
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:08     Проверка ввода #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    while (true){
        switch (getch()){
            case '1':
            cout<<"1";
            break;
            case '2':
            cout<<"2";
            break;
            default:
            cout<<"error symbol";
            break;
        }
    }
также пишеш и про цифры 3 4 5 6 7 8 9 0
smithy69
17 / 16 / 1
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 23:20     Проверка ввода #7
ну смотри, вводишь символ цифру, в таблице ASCII код который соответсвует цифрам так же упорядочен, то есть 0 соответствует 48, 1 - 49 и так далее. то есть simvol>='0' означает, что мы берем код символа simvol и сравниваем с кодом '0', то есть берём цифры больше 0, и так же simvol<=9, и эти два условия объединяем && - истино только тогда когда истинны оба. то есть если мы введём не цифру, то код символа не будет входить в наш промежуток, ну и можешь вывести оповещение какое нибудь

Добавлено через 1 минуту
to PointsEqual

C++
1
while(true)
хорошее ограничение
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:21     Проверка ввода #8
Цитата Сообщение от smithy69 Посмотреть сообщение
ну смотри, вводишь символ цифру, в таблице ASCII код который соответсвует цифрам так же упорядочен, то есть 0 соответствует 48, 1 - 49 и так далее. то есть simvol>='0' означает, что мы берем код символа simvol и сравниваем с кодом '0', то есть берём цифры больше 0, и так же simvol<=9, и эти два условия объединяем && - истино только тогда когда истинны оба. то есть если мы введём не цифру, то код символа не будет входить в наш промежуток, ну и можешь вывести оповещение какое нибудь
как то сложно

Добавлено через 21 секунду
Цитата Сообщение от smithy69 Посмотреть сообщение
while(true)
это просто пример
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 23:21  [ТС]     Проверка ввода #9
А через ASCII - код можна сделать???
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:25     Проверка ввода #10
Цитата Сообщение от MILAN Посмотреть сообщение
А через ASCII - код можна сделать???
можно все. только это запутаннее
smithy69
17 / 16 / 1
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 23:25     Проверка ввода #11
C++
1
2
3
4
5
6
if ((simvol>='0')&&(simvol<='9')) {
                                                   //то что нужно сделать, если всё ок
                                                  }
  else {
          //то что нужно сделать если не цифра
         }
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 23:30  [ТС]     Проверка ввода #12
Дело в том, что у меня есть число, я его розбиваю на цифры, и отдельно, в цикле, каждую цифру проверяю, попадает ли она в условие!!! Только вот когда в числе встречается символ.....
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.03.2010, 23:43     Проверка ввода #13
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
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
 
bool isNum(const std::string& buf){
    for ( std::string::const_iterator i = buf.begin(); i != buf.end(); ++i )
        if ( !isdigit(*i) )
            return false;
    return true;
}
 
int main(){
    std::string buf;
    
    while ( true ) {
        std::cout << "Number (empty - exit): ";
        std::getline(std::cin, buf);
        if ( buf.empty() )
            break;
        if ( !isNum(buf) )
            std::cout << "Oh, no! It is not a number!" << std::endl;
        else
            std::cout << "Oh, yeah! It is a number " <<  atoi(buf.c_str()) << std::endl;
    }
    
    exit(0);
}
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:48     Проверка ввода #14
easybudda, я смотрю ты оч хорошо стандартной библиотекой пользуешся) что не сообщение то stl
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.03.2010, 23:55     Проверка ввода #15
Цитата Сообщение от PointsEqual Посмотреть сообщение
что не сообщение то stl
а так и проще, и короче
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 00:06  [ТС]     Проверка ввода #16
easybudda, вы можете поправить код, что бы шла проверка???
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdlib>
using namespace std;
int oct_сhislo(unsigned long long int ch, int pos);
long DecToOct(unsigned long long int dec);
long OctToDec(unsigned long long int oct1);
unsigned long long int swap1=0,d,o,o_dec;
string s_oct; 
int ex=0;
bool st=true;
char ch1, var;
int main()
{
    setlocale(LC_ALL,"Russian");
    for (;;)
    {
      cout<<"1 - Перевести число з 8-рiчноi в 10-рiчну систему числення\n";
      cout<<"2 - Перевести число з 10-рiчноi в 8-рiчну систему числення\n";
      cout<<"0 - Вихiд з програми\n\n";
      cin>>var;
         switch(var)
         {
           case '1':
              s_oct="";
              system("cls");
              cout<<"Введiть число в 8-рiчнiй системi числення:  ";
              std::cin>>o;
              cout<<"\nЧисло в 8-рiчнiй системi числення - ";
              DecToOct(o); 
            break;           
           case '2':
               s_oct="";
              system("cls");
              cout<<"Введiть число в 10-рiчнiй системi числення:  ";
              std::cin>>d;
              cout<<"\nЧисло в 8-рiчнiй системi числення - ";
              DecToOct(d); 
             break;
           case '0':
             exit(0);
               break;
           default:
            cout<<"Помилка вибору!!!!";
             break;
        break;
         }
    system("cls");
    }
    return 0;
}
long DecToOct(unsigned long long int dec)
{   
    for (dec;dec>=1;)
       {     
            swap1=static_cast<int>(dec%8);
            std::ostringstream ost;
            ost<<swap1;
            s_oct+=ost.str();
            dec=dec/8;
            
       }
    std::string ss(s_oct);
    std::reverse(ss.begin(), ss.end());
    std::cout<<ss<<std::endl<<std::endl;
    return 0;
}
int oct_chislo(unsigned long long int ch, int pos)
{
    unsigned long long int div = 1;
    int i;
    for(i = 1; i < pos; ++i)
        div *= 10;
    return static_cast<int>((ch/div) % 10);
}
long OctToDec(unsigned long long oct1)
{   
    std::ostringstream sto;
    sto<<oct1;
    int n=(sto.str()).length();
    for(int i=1;i<n+1;++i)
    { 
      o_dec +=(oct_chislo(oct1,i))*pow(static_cast<double>(8),static_cast<int>(i-1));
    }cout<<o_dec<<endl;
    o_dec=0;
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 00:42     Проверка ввода #17
MILAN, я бы всё не так делал. Число должно читаться, как строка, а потом в соответствии с выбором меню проверяться на допустимые символы. Для восьмеричного числа это 0-7, для шестнадцатиричного 0-9a-f...
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 00:43  [ТС]     Проверка ввода #18
Приведите пожалуйста пример!!!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 01:10     Проверка ввода #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
#include <iostream>
#include <string>
 
bool isOctNum(const std::string& s){
    static const std::string valid_chars("01234567");
    return s.find_first_not_of(valid_chars) == std::string::npos;
}
 
bool isHexNum(const std::string& s){
    static const std::string valid_chars("0123456789abcdefABCDEF");
    return s.find_first_not_of(valid_chars) == std::string::npos;
}
 
 
int main(){
    std::string buf;
    
    while ( true ){
        std::cout << "Number: ";
        std::getline(std::cin, buf);
        if ( buf.empty() )
            break;
        std::cout << "Is " << ( isOctNum(buf) ? "" : "not " ) << "valid oct number." << std::endl;
        std::cout << "Is " << ( isHexNum(buf) ? "" : "not " ) << "valid hex number." << std::endl;
    }
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2010, 02:00     Проверка ввода
Еще ссылки по теме:

C++ Проверка ввода чисел
Проверка ввода данных в C++ C++
Проверка ввода по шаблону C++

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

Или воспользуйтесь поиском по форуму:
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 02:00  [ТС]     Проверка ввода #20
А как потом buf перевести в число???
Yandex
Объявления
10.03.2010, 02:00     Проверка ввода
Ответ Создать тему
Опции темы

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