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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.91
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
16.04.2010, 23:47     Проверка ввода #1
Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно к примеру задать числовой масив типа (int). Как зделать так чтоб когда пользователь вводит к примеру Ф123;:87!"№;;%:!"№;%:?*(99321фвфв и тд.. или что нить подобное после проверки попросить повторить ввод даного елемента масива(или числа)?
Я находил в темах немного подобное моему примеру но не смог розобратса, покажыте пожалуста как ето зделать и если можна то в Borland C++.
Зарание спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2010, 23:47     Проверка ввода
Посмотрите здесь:

Проверка ввода C++
C++ проверка ввода C++
C++ Проверка правильности ввода
Проверка ввода C++
C++ Проверка ввода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 16:26  [ТС]     Проверка ввода #21
neske те респект!!! neske неске круче всех!!!
твоя прога лутшая я токо доделал чтоб с минусовые значения мона было вводить вот код!!
Код
#include <iostream.h>
 
int main()
{
        setlocale( LC_ALL,"Russian" );
 
        int N;
    std::cout << "Введите кол-во элементов массива: ";
    std::cin >> N;
    int *MAS=new int [N];
 
        char ch[20]={'0'}; // заполняем char массив нулями.
        int key; 
 
        for (int i=0; i<N; i++)
        {
                std::cout << "MAS["<< i <<"]: "; // запрашиваем число,
                std::cin >> ch;                                 // и записываем его в массив char.

                for (int j=0; j<20; j++) // циклом проходим по всем элементам массива char.
                {
                        key=int(ch[j]); // переменной key присваиваем номер знака в ANSI.
                        if (key==0) break; // т.к. первоначально массив был заполнен нулями, делаем проверку.
                        if ((key<45) ||(key==46) ||(key==47) || (key>57)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
                        {
                                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                                i-=1;
                                break;
                        }
                }
 
        MAS[i]=atoi(ch);
        }
        for(int i=0;i<N;i++){cout<<" "<<MAS[i];}
 
        delete []MAS;
    system("pause");
        return 0;
}
Добавлено через 3 минуты
[
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.04.2010, 17:11     Проверка ввода #22
Morfiy, код который написал уважаемого neske имеет изьян, т.к. он основывается на конкретных кодах символов цифр, что совсем не хорошо. В зависимости от используемой кодовой страницы, коды символов могут меняться.
Для того чтобы обойти подобную ситуацию необходимо использовать функцию isdigit.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
17.04.2010, 20:41     Проверка ввода #23
CyBOSSeR, на самом деле когда писал, пытался нагуглить что-то подобное, но у меня не удалось.
Учту на будущее, спасибо.

PS - Morfiy,
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.04.2010, 21:51     Проверка ввода #24
neske, не за что.
Еще было бы неплохо выделить код отвечающий за ввод цифры в отдельную функцию, как то так например (не проверял):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <algorithm>
#include <functional>
#include <cctype>
#include <cstdlib>
 
int EnterNumber() {
  std::string str;
  std::getline(std::cin, str);
 
  while (std::find_if(str.begin(), str.end(), std::not1(std::isdigit)) != str.end()) {
    std::cout << "Input error. Repeat input: ";
    std::getline(std::cin, str);
  }
 
  return std::atoi(str.c_str());
}
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 12:59  [ТС]     Проверка ввода #25
Всем спасибо за помощь если у кого будут идеи как улутшыть способ проверки даных вылажуйте )
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 15:48     Проверка ввода #26
я же написал способ, чтоб вообще нельзя было вводить что-то ненужное, т.е. без всяких всплывающих ошибок, на экран выводится и числу присваивается только то, что можно ввести
там только нужно дописать для плавающей точки и знака минус)
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:29  [ТС]     Проверка ввода #27
Цитата Сообщение от Vorona Посмотреть сообщение
я же написал способ, чтоб вообще нельзя было вводить что-то ненужное, т.е. без всяких всплывающих ошибок, на экран выводится и числу присваивается только то, что можно ввести
там только нужно дописать для плавающей точки и знака минус)
твоя прога не совсем коректно работа мож помоч ето убать а именно если не чево не вводиш а нажымаеш ентр числу присваюетса 0
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 16:39     Проверка ввода #28
а нужно, чтоб не выводило 0, а дальше запрашивало ввод, пока не будет присвоено какое-либо значение?
т.е. пока мы сами не нажмем 0, число не должно быть образовано?
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:54  [ТС]     Проверка ввода #29
Цитата Сообщение от Vorona Посмотреть сообщение
а нужно, чтоб не выводило 0, а дальше запрашивало ввод, пока не будет присвоено какое-либо значение?
т.е. пока мы сами не нажмем 0, число не должно быть образовано?
скажу ну оч попроще
когда запускаеш твою прогу и просто нажымаеш токо Enter оно присваюет масиву значение "0"

нада чтоб оно просто не чево не делал)
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 17:08     Проверка ввода #30
Morfiy, попробуй:
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
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
#include <cstdlib>
 
bool IsNotDigit(char ch) {
  return !std::isdigit(ch);
}
 
int EnterNumber() {
  std::string str;
  std::getline(std::cin, str);
 
  while (std::find_if(str.begin(), str.end(), IsNotDigit) != str.end()) {
    std::cout << "Input error. Repeat input: ";
    std::getline(std::cin, str);
  }
 
  return std::atoi(str.c_str());
}
 
int main() {
  const int size      = 10;
        int arr[size];
 
  for (int i = 0; i < size; ++i) {
    std::cout << "arr[" << i + 1 << "] = ";
    arr[i] = EnterNumber();
  }
 
  std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
 
  std::cout << std::endl;
 
  return 0;
}
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 17:23     Проверка ввода #31
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void enter(float&);
 
void main(){        
    float x = 2;
    enter(x);
    cout << endl << x << endl;
    system("pause");
}
 
void enter(float &X){
    int i = 0;
    char c = 0, x[10];
    x[0] = 'x';
        
        while(c != 13){
                c = getch();
        if(c == 8){
                        if(x[i] != 'x'){
                                cout << "\b \b";
                                x[(i--)-1] /= 10;
                }
                        if(i == 0)
                x[i] = 'x';
                }
                if(c >= '0' && c <= '9'){
                        x[i] = c;
                        cout << x[i];
                        i++;
                }
    }
 
        if(x[0] != 'x')
        X = atof(x);
}
теперь все, как просили, ничего не жмем, х остается таким, как был прежде)
для проверки в ф-ции main() пишем х, чтобы убедится в том, какое именно значение х остается после ввода, прежнее или введенное и обработанное ф-цией)

p.s. спасибо вам, Morfiy, благодаря вашим замечаниям ф-ция стала лучше)
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 18:02  [ТС]     Проверка ввода #32
В 32-й строке кода у меня выдает ошыбку
Expression syntax
Undefined symbol 'ostream_iterator'

Добавлено через 56 секунд
ето у CyBOSSeR

Добавлено через 12 минут
Цитата Сообщение от Vorona Посмотреть сообщение
теперь все, как просили, ничего не жмем, х остается таким, как был прежде)
для проверки в ф-ции main() пишем х, чтобы убедится в том, какое именно значение х остается после ввода, прежнее или введенное и обработанное ф-цией)
Ех...
Ты не понял что я имел виду.
float x=2;//здесь ты задаеш первоначальное значение х которое будет выводитса если пользователь не введет ни одного символа з клавиатуры и нажмет Ентер
Вот так будет работать прога ета:
//------

2
Для продолжения нажмите любую клавишу . . .
//--
суть проблемы в том что к примеру какаято блондинка на роботе будет пить кофе и случайно зажмет Ентер и выйдет так что она задаст весь масив числами 2
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 18:04     Проверка ввода #33
Цитата Сообщение от Morfiy Посмотреть сообщение
В 32-й строке кода у меня выдает ошыбку
Expression syntax
Undefined symbol 'ostream_iterator'
Попробуй подключить заголовочный файл <iterator>.
C++
1
#include <iterator>
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 18:14     Проверка ввода #34
Morfiy, так вы попросили ничего не присваивать х, вот и ни чего не присваивается, если будет просто float x, то массив будет забит вообще левыми числами, изначально он забивался нулями, и после вашего вопроса, я хотел уточнить, если пользователь нажимает просто Enter, без присваивания до этого какого-либо значения, то программа ничего не делает, а ждет, пока не будет введено хоть какое-то значение?
как обычный cin >> x; жмем Enter, а оператор ждет, пока не получит какой-то символ перед нажатием Enter?
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 18:44  [ТС]     Проверка ввода #35
Цитата Сообщение от Vorona Посмотреть сообщение
Morfiy, так вы попросили ничего не присваивать х, вот и ни чего не присваивается, если будет просто float x, то массив будет забит вообще левыми числами, изначально он забивался нулями, и после вашего вопроса, я хотел уточнить, если пользователь нажимает просто Enter, без присваивания до этого какого-либо значения, то программа ничего не делает, а ждет, пока не будет введено хоть какое-то значение?
как обычный cin >> x; жмем Enter, а оператор ждет, пока не получит какой-то символ перед нажатием Enter?
Да.
когда пользователь будет нажымать ентер и перед етим он не ввел ни какого значения, чтоб програма ждала пока независимо скоко раз он надмет ентер пока пользователь не введет значение

Добавлено через 15 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Попробуй подключить заголовочный файл <iterator>
у тя таже проблема что и у Vorona.
когда пользователь будет нажымать ентер и перед етим он не ввел ни какого значения то твоя програма присваиваит значения 0 масиву
//----
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
что у тебя делает ета функцыя?
а то когда я ее удалаю из кода прога в конце выводит результат так:
1 2 3 4 5 6 7 8 9 0
а когда ее не удалять результат выводитса так:
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
Вот что я добавил в код твоей програмы:
Код
for (int i = 0; i < size; ++i) {
    std::cout << arr[i]<<" ";  }
    getch();
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
18.04.2010, 18:51     Проверка ввода #36
Цитата Сообщение от Morfiy Посмотреть сообщение
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
вывод массива на экран
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 19:04     Проверка ввода #37
Цитата Сообщение от Morfiy Посмотреть сообщение
C++
1
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
что у тебя делает ета функцыя?
Выводит содержание массива на экран.
Цитата Сообщение от Morfiy Посмотреть сообщение
у тя таже проблема что и у Vorona.
Проблема решается на раз. Новая версия функции EnterNumber:
C++
1
2
3
4
5
6
7
8
9
10
11
int EnterNumber() {
  std::string str;
  std::getline(std::cin, str);
 
  while (str.length() == 0 || std::find_if(str.begin(), str.end(), IsNotDigit) != str.end()) {
    std::cout << "Input error. Repeat input: ";
    std::getline(std::cin, str);
  }
 
  return std::atoi(str.c_str());
}
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.04.2010, 19:21     Проверка ввода #38
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void enter(float&);
 
void main(){            
        float x;
        enter(x);
        cout << endl << x << endl;
        system("pause");
}
 
void enter(float &X){
        bool flag = true;
    int i = 0;
        char c = 0, x[10];
        x[0] = 'x';
                
        while(flag == true){
                c = getch();
                if(c == 8){
                        if(x[i] != 'x'){
                                cout << "\b \b";
                                x[(i--)-1] /= 10;
                        }
                        if(i == 0)
                                x[i] = 'x';
                }
                if(c >= '0' && c <= '9'){
                        x[i] = c;
                        cout << x[i];
                        i++;
                }
        if(c == 13 && x[i] != 'x')
            flag = false;
    }
        X = atof(x);
}
вот, пожалуйста)
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 19:36  [ТС]     Проверка ввода #39
Спасибо всем за помощь!!!
найболее правильный придставили Vorona и CyBOSSeR
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2010, 12:18     Проверка ввода
Еще ссылки по теме:

C++ gets() проверка ввода
C++ проверка ввода данных
Проверка правильности ввода C++

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

Или воспользуйтесь поиском по форуму:
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
22.04.2010, 12:18     Проверка ввода #40
Понимаю, что уже поздно... но, все же вот еще вариант :
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
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <locale.h>
int proverka (char *b);
 
using namespace std;
 
const int SIZE=100;
 
int main() 
{
    setlocale(LC_ALL,"Russian");
    int n,k=0,d,a[SIZE],t=0;
    char b[SIZE];
 
    cout<<"Vvtdite n: ";
    cin>>n;
    cin.ignore(SIZE, '\n');
    
    for (int i=0; i<n; i++)
    {
        cout<<"Ведите ["<<i+1<<"] элемент массива: ";
        cin.getline(b, SIZE);
        t=proverka(b);
        if (t<0)
        {
            cout<<"Ошибка ввода!\n";
            i--;
        }
        else a[k++]=t;
    }
    cout<<"Rezultat: ";
    for (int i=0; i<k; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
int proverka (char *b)
{
    int d=0, n, k=0;
    char *b1=b;
    d=strlen(b);
    while(*b1)
    {
        if (*b1>='0'&&*b1<='9')
            k+=1;
        b1++;
    }
    if (k==d)
    {
        n= atoi (b);
        return n;
    }
    else 
        return -1;
}
Конструктивная критика приветствуется
Yandex
Объявления
22.04.2010, 12:18     Проверка ввода
Ответ Создать тему
Опции темы

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