Форум программистов, компьютерный форум 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() проверка ввода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ivaneo
2 / 2 / 0
Регистрация: 01.08.2009
Сообщений: 16
10.03.2010, 06:39     Проверка ввода #21
Функцией atoi()
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 08:48  [ТС]     Проверка ввода #22
У меня значение unsigned long long int, atoi работает с int, если я не ошыбаюсь.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 09:08     Проверка ввода #23
Цитата Сообщение от MILAN Посмотреть сообщение
А как потом buf перевести в число???
Ну, если
Цитата Сообщение от MILAN Посмотреть сообщение
unsigned long long int swap1=0,d,o,o_dec;
то, наверное, вот этим...
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 15:52  [ТС]     Проверка ввода #24
Превидите пожалуста пример использования stoull.

Добавлено через 32 минуты
Не могу понять синтаксис.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 16:11     Проверка ввода #25
Цитата Сообщение от MILAN Посмотреть сообщение
Превидите пожалуста пример использования stoull.
Это очередное мелкософтовское чудо. У меня вот так только может быть:
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
#include <iostream>
#include <string>
#include <cstdlib>
 
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;
    unsigned long long int val;
 
    std::cout << "Enter OCT value: ";
    std::cin >> buf;
    if ( isOctNum(buf) ){
        // val = std::stoull(buf, 0, 8); // MS VS version
        val = strtoull(buf.c_str(), NULL, 8);
        std::cout << "DEC value is: " << val << std::endl;
    }
    else
        std::cout << "Is not OCT value!" << std::endl;
 
    std::cout << "Enter HEX value: ";
    std::cin >> buf;
    if ( isHexNum(buf) ){
        // val = std::stoull(buf, 0, 16); // MS VS version
        val = strtoull(buf.c_str(), NULL, 16);
        std::cout << "DEC value is: " << val << std::endl;
    }
    else
        std::cout << "Is not HEX value!" << std::endl;
 
    return 0;
}
по-хорошему ещё на переполнение проверять ( errno == ERANGE )
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 16:19  [ТС]     Проверка ввода #26
какую библиотеку использует strtoull??? У меня чето не пашет.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 16:23     Проверка ввода #27
Цитата Сообщение от MILAN Посмотреть сообщение
какую библиотеку использует strtoull??? У меня чето не пашет.
Код
SYNOPSIS
     #include <stdlib.h>
     #include <limits.h>

     unsigned long
     strtoul(const char * restrict nptr, char ** restrict endptr, int base);

     unsigned long long
     strtoull(const char * restrict nptr, char ** restrict endptr, int base);
в С++ достаточно
C++
1
#include <cstdlib>
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 16:24  [ТС]     Проверка ввода #28
Почему тогда не пашет???
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 16:26     Проверка ввода #29
Цитата Сообщение от MILAN Посмотреть сообщение
Почему тогда не пашет???
Компилятор какой?
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 16:28  [ТС]     Проверка ввода #30
MS VS 2005
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 16:52     Проверка ввода #31
Цитата Сообщение от MILAN Посмотреть сообщение
MS VS 2005
тогда так:
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
#include <iostream>
#include <string>
// #include <cstdlib> // for gcc version
 
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;
    unsigned long long int val;
 
    std::cout << "Enter OCT value: ";
    std::cin >> buf;
    if ( isOctNum(buf) ){
        // val = std::stoull(buf, 0, 8); // MS VS 2005 version
        // val = strtoull(buf.c_str(), NULL, 8); // gcc C99 version
        val = _strtoui64(buf.c_str(), NULL, 8); // MS VS 2005 version
        std::cout << "DEC value is: " << val << std::endl;
    }
    else
        std::cout << "Is not OCT value!" << std::endl;
 
    std::cout << "Enter HEX value: ";
    std::cin >> buf;
    if ( isHexNum(buf) ){
        // val = std::stoull(buf, 0, 16); // MS VS 2010 version
        // val = strtoull(buf.c_str(), NULL, 16); // gcc C99 version
        val = _strtoui64(buf.c_str(), NULL, 16); // MS VS 2005 version
        std::cout << "DEC value is: " << val << std::endl;
    }
    else
        std::cout << "Is not HEX value!" << std::endl;
 
    return 0;
}
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 17:17  [ТС]     Проверка ввода #32
Спасибо!!!! А функция _strtoui64 может возвращать только 10-тичное значение, или любые???
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
10.03.2010, 17:28     Проверка ввода #33
а множеством сделать нельзя???
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 17:31  [ТС]     Проверка ввода #34
Непонял!!!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 17:36     Проверка ввода #35
Цитата Сообщение от MILAN Посмотреть сообщение
А функция _strtoui64 может возвращать только 10-тичное значение, или любые???
Она возвращает 64-битное беззнаковое целое число. А в каком виде его выводить - это уже как в std::cout отправите...
C++
1
2
3
#include <iomanip>
...
std::cout << std::ios::hex << val;
выведет число в шестнадцатиричном формате.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 17:56  [ТС]     Проверка ввода #36
Ввожу 123, выводит в шестнадцатиричной 2048123!!!!
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
10.03.2010, 18:03     Проверка ввода #37
easybudda, я stl читаю, тут написано 2 варианта присвоения значений эл-ам вектора:
C++
1
vector<int> v(10);
1)
C++
1
2
3
4
5
while(p!=v.end()){
   *p=i;
   ++p;
   ++i;
}
2)
C++
1
2
for (i=0; i<10; ++i)
v[i]=i;
какой лучше использовать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2010, 18:17     Проверка ввода
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.03.2010, 18:17     Проверка ввода #38
Цитата Сообщение от PointsEqual Посмотреть сообщение
2 варианта присвоения значений эл-ам вектора:
...
какой лучше использовать?
Какой для присвоения значений лучше - честно говоря, не знаю, в данном случае по-моему без разницы. Знаю, что есть и ещё способы присвоения значений... К примеру для std::vector есть ещё push_back() и insert(), а также итератор back_inserter...

Добавлено через 5 минут
Цитата Сообщение от MILAN Посмотреть сообщение
Ввожу 123, выводит в шестнадцатиричной 2048123!!!!
Погорячился я немного... Вот так
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <iomanip>
 
int main(){
    int i = 123;
    std::cout << std::hex << i << std::endl;
    return 0;
}
выведет 7b
Yandex
Объявления
10.03.2010, 18:17     Проверка ввода
Ответ Создать тему
Опции темы

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