Проверка ввода

Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно к примеру задать числовой масив типа (int). Как зделать так чтоб когда пользователь вводит к примеру Ф123;:87!"№;;%:!"№;%:?*(99321фвфв и тд.. или что нить подобное после проверки попросить повторить ввод даного елемента масива(или числа)? Я находил в темах немного подобное моему примеру но не смог розобратса, покажыте пожалуста как ето зделать и если можна то в Borland C++. Зарание спасибо.
14 ответов

#include <iostream>
 
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<47) || (key>58)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
            {
                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                i-=1;
                break;
            }
        }
 
    MAS[i]=atoi(ch);
    }
 
    delete []MAS;
    system("pause");
    return 0;
}
Размер char массива можно изменять, просто я так поставил
у у тя тож прога работа не верно не розпазнает"/" и когда ввожу "!"№;%:?*()" виснет


Да, увидел ошибку. Исправил:
Код
#include <iostream>
 
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<48) || (key>58)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
                        {
                                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                                i-=1;
                                break;
                        }
                }
 
        MAS[i]=atoi(ch);
        }
 
        delete []MAS;
    system("pause");
        return 0;
}


neske, вот полный код, рабочий:
#include <iostream>
using namespace std;
 
int main()
{
    int N;
    cout << "N -> ";
    cin >> N;
    int* A = new int[N];
    for (int i=0;i<N;i++)
    {
        cout << "A[ " << i << " ]-> ";
        while (!(cin >> A[i]))
        {
            cin.clear();
            while (cin.get() != '\n') continue;
            cout << "Повторите ввод -> ";
        }
    }
    for (int i=0;i<N;i++) cout << A[i] << " ";
    cout << endl;
    return 0;
    delete [] A;
}


не совсем понятна задача... если массив инт, то может надо потребовать, чтобы вводились только числа? или что, объясни лучше


Вот самый простой пример:
#include<iostream.h>
#include<conio.h>
main(){
int a[16383],r;
cout<<"vvedite rozmirnist";
cin>>r;
cout<<"vvedite vvedite masiv";
for(int i=1;i<=r;i++)
cin>>a[i];
getch();
return 0;
}
мне нужно зделать так чтоб когда пользователь введет в (r a[i]) какую нибудь чуж к примеру:Ё!"№;%:?*()_+\ ЙЦУКПРОЛОЛРkljnklnn и тд. Нада чтоб выбило сообщение про ошыбку ввода и попросило ввести снова. но суть дела когда в переменною вводиш какое нибудь символ кроме числапрограма виснет. Я думаю проверка должна ити по принцыпу гдето так:
#include<iostream.h>
#include<conio.h>
main(){
int key,a[16383];
char ch;
A:
cout<<"-----";
cin>>ch;
key=(int)ch;//переводит в код,для от 0 до 9 ето 48-57
if((key==48)||(key==49)||(key==50)||(key==51)||(key==52)||(key==53)||(key==54)||(key==54)||(key==55)||(key==56)||(key==57))
{cout<<"vvod vernuy";
key=key-48;
cout<<key;
}
else {cout<<"oshubka"; goto A;
getch();
return 0;
}
ну вот такую проверку делал я но у нее оч много минусов: 1)розпознаетиса токо 1 символ тоитсть если веду 27 мне выведе в конце 2 2)когда идет присвоения к масиву в цыкле типа a[i]=key; и я перед етим ввел сh=111111 то оно присвоит так а[i]=1; а[i+1]=1; а[i+2]=1; а[i+3]=1; а[i+4]=1; а[i+5]=1; Думаю суть моей проблемы тепер более ясна!!))


про скан-код (анси-код) слышал? задай просто диапазон вводимых значений. что-то типа...:
{
cin >> a[i];
if (a[i]>={скан-код 0}&&a[i]<={скан-код 0})
cout << a[i]
}
вроде на enter ругаться не должен


про скан-код (анси-код) слышал? задай просто диапазон вводимых значений. что-то типа...:{ cin >> a[i]; if (a[i]>={скан-код 0}&&a[i]<= {скан-код 0}) cout << a[i] }вроде на enter ругаться не должен
можеш плз показать что именно тут длолжни быть {скан-код 0}


Можно так, но тоже не очень удобно, т.к. вводить нужно только строго по одному числу...
#include <iostream>
#include <cstdlib>
using namespace std;
 
const int SIZE=100;
 
int main() 
{
    int a[SIZE]; 
    int n, j=0,b;
    
    cout<<"Vvtdite n: ";
    cin>>n;
    
    for (int i=0; i<n; i++)
    {
        cout<<"Vvedite chislo massiva: ";
        cin>>b;
        if (cin.good()) //проверка ввода (если верно, присваиваем элементу массива)
            a[j++]=b;
        else 
        {
            cout << "Nevernoe chislo. "; //если нет, выводим сообщение ошибке
            i--;
            cin.clear();// удаляем введенное число
            flushall();
 
        }
    }
    cout<<"Rezultat: ";
    for (int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}


обычного си щас нет...так что написать со скан-кодами не смогу...


Можно так, но тоже не очень удобно, т.к. вводить нужно только строго по одному числу...
#include <iostream>
#include <cstdlib>
using namespace std;
 
const int SIZE=100;
 
int main() 
{
    int a[SIZE]; 
    int n, j=0,b;
    
    cout<<"Vvtdite n: ";
    cin>>n;
    
    for (int i=0; i<n; i++)
    {
        cout<<"Vvedite chislo massiva: ";
        cin>>b;
        if (cin.good()) //проверка ввода (если верно, присваиваем элементу массива)
            a[j++]=b;
        else 
        {
            cout << "Nevernoe chislo. "; //если нет, выводим сообщение ошибке
            i--;
            cin.clear();// удаляем введенное число
            flushall();
 
        }
    }
    cout<<"Rezultat: ";
    for (int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
програма работает неверно когда пользователь вводит Qwe!!#$%^&*(13313 то она выдает ошыбку а если 123Qwe!!#$%^&*(13313 то она123 записует в масив и выдет ошыбку и просит ввести следущий елемент масива


А почему бы просто не вводить всё изначально в чаровский массив и в нём искать ошибки? Если i-й элемент не является цифрой - записываем его индекс в массив индексов и затем выводим пользователю сообщение с просьбой ввести повторно элементы, стоящие на этих позициях, затем заново менять все введённые элементы в чаровском массиве на вновь введённые и так до тех пор, пока ввод не будет полностью корректен... Это если я правильно понял задание)))


#include <iostream>
 
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<47) || (key>58)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
            {
                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                i-=1;
                break;
            }
        }
 
    MAS[i]=atoi(ch);
    }
 
    delete []MAS;
    system("pause");
    return 0;
}
Размер char массива можно изменять, просто я так поставил


for (int i=0;i<N;i++)
{
  cout << "A[ << i << ]-> ";
  while (!(cin >> A[i]))
  {
    cin.clear();
    while (cin.get() != '\n') continue;
    cout << "Повторите ввод -> ";
  }
}


k1ry4, при вводе, к примеру: 123qweqe, всеравно будет записано в массив, хотя и выдает сообщение о повторе.