Форум программистов, компьютерный форум, киберфорум
-=ЮрА=-
Войти
Регистрация
Восстановить пароль

Безопасный ввод через функцию-шаблон

Запись от -=ЮрА=- размещена 02.01.2013 в 19:01
Показов 5686 Комментарии 22

К моему сожалению уже не первый раз встречаю банальное неумение начинающих вводить в свои программы так называемую "защиту от дурака". Собственно углубляться в теорию не буду - ниже простой код, который без особых усилий позволяет оснастить консоль указанной защитой
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
#include <string>
#include <iostream>
using namespace std;
 
//Объявляем функцию шаблон
//Функция вернёт ИСТИНА если параметр val был веден корректно
//в противном случае возврат от функции ЛОЖЬ
template <class T>
bool SafeInput
(
    const char * msg,//сообщение которое будет сопутствовать вводу
    T &val
);
 
int main()
{
    int    iVal;//Целочисленная переменная
    double dVal;//Вещественная переменная
    while(true)
    {
        if(!SafeInput("Enter integer : ",iVal))//Безопасный ввод int
            cout<<"Incorrect input"<<endl;
        else
            cout<<"Your input : "<<iVal<<endl;
 
        if(!SafeInput("Enter double  : ",dVal))//Безопасный ввод double
            cout<<"Incorrect input"<<endl;
        else
            cout<<"Your input : "<<dVal<<endl;
 
    }
    return 0;
}
 
template <class T>
bool SafeInput
(
    const char * msg,//сообщение которое будет сопутствовать вводу
    T &val
)
{
    bool bOk = true;//Флаг успешного ввода
    cout<<msg;//Вывод на экран сопутствующего сообщения
    //Проверка на корректный ввод должна содержать не только if(!(cin>>val) )
    //но и проверку на то что строка более не содержит символов т.е cin.get() != '\n'
    if(!(cin>>val) || cin.get() != '\n')
        bOk = false;
    if(!bOk)
    {
        cin.clear();//Сброс флагов ошибок
        cin.sync();//Очистка буфера ввода
    }
    return bOk;
}
Миниатюры
Нажмите на изображение для увеличения
Название: SafeInput.JPG
Просмотров: 1028
Размер:	19.2 Кб
ID:	1643  
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 22
Комментарии
  1. Старый комментарий
    -=ЮрА=- огромное спасибо, как всегда на высоте.
    Запись от isaak размещена 29.01.2013 в 22:42 isaak вне форума
  2. Старый комментарий
    Аватар для SatanaXIII
    Пардон за глазастость, но в main при вводе double в комментарии наверное должно быть "Безопасный ввод double".
    Запись от SatanaXIII размещена 30.01.2013 в 10:26 SatanaXIII вне форума
  3. Старый комментарий
    А не проще и понятней проверить биты ошибок?
    Ведь если мы через cin>>a; требуем ввод int, а пользователь подсунул что-то другое, выставляется соответствующий бит.
    C++ (Qt)
    1
    2
    3
    4
    5
    6
    7
    
      if(!(cin>>val) || cin.get() != '\n')
            bOk = false;
        if(!bOk)
        {
            cin.clear();//Сброс флагов ошибок
            cin.sync();//Очистка буфера ввода
        }
    можно написать
    C++ (Qt)
    1
    2
    3
    4
    5
    6
    7
    
    cin>>val;
    bOk = cin.good();
    if(!bOk)
    {
        cin.clear();//Сброс флагов ошибок
        cin.sync();//Очистка буфера ввода
    }
    Запись от Dmitriy_M размещена 10.02.2013 в 21:39 Dmitriy_M вне форума
  4. Старый комментарий
    Аватар для -=ЮрА=-
    Нет не проще и проверка на \n при вводе необходима,почему-подумай...
    Запись от -=ЮрА=- размещена 11.02.2013 в 00:18 -=ЮрА=- вне форума
  5. Старый комментарий
    зачем там \n в принципе понятно.
    Пользователь может вести "1213 бла бла бла\n".
    тогда на этот случай сократим до
    C++ (Qt)
    1
    2
    3
    4
    5
    
    cin>>val;
    bOk = cin.good();
    cin.clear();
    cin.sync();
    return bOk;
    Запись от Dmitriy_M размещена 11.02.2013 в 10:48 Dmitriy_M вне форума
  6. Старый комментарий
    Аватар для -=ЮрА=-
    Пользователь может вести "1213 бла бла бла\n".
    тогда на этот случай сократим до
    Dmitriy_M. прости но напишу как есть - чертовски угнетает когда какой-нибудь начинающий, не разобравшись и не понимая ввсего лезет со своими глупостями. Для тебя, да и для всех читающих полный расклад того некорректа который предлагаешь. Больше возвращаться не хочу!
    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>
    using namespace std;
     
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение которое будет сопутствовать вводу
        T &val
    );
     
    int main()
    {
        double val = 0;
        while(true)
        {
            if(!SafeInput("Enter double : ", val))
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<val<<endl;
        }
        return 0;
    }
     
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение которое будет сопутствовать вводу
        T &val
    )
    {
        cout<<msg;
        cin>>val;
        bool bOk = cin.good();
        cin.clear();
        cin.sync();
        return bOk;
    }
    Отработка
    Enter double : 25.vot naglyadni primer
    Your input : 25
    Enter double :
    Как думаешь ввод 25.vot naglyadni primer должен восприниматься как корректный или же выдать ошибку, м???!
    Попробуй в моем коде сделать аналогичный ввод дабла: цифра точка и пару слов сзади, что удивлён?Вот потому и нужна проверка \n. Поэтому предложенное вверху условие
    C++
    1
    
    if(!(cin>>val) || cin.get() != '\n')
    - с одной стороны обеспечивает максимальную лаконичность кода, с другой максимальную функциональность и проверку.
    Впредь прошу постить с реальными предложениями, а не гдаить мой блог непродуманными конструкциями.
    (У меня было время подумать над кодом, потому то что есть в коде поста1 - это минимально необходимый и максимально лаконичный отточенный вариант безопасного ввода - лучше никак другими словами...)
    Запись от -=ЮрА=- размещена 11.02.2013 в 12:19 -=ЮрА=- вне форума
  7. Старый комментарий
    Цитата Сообщение от -=ЮрА=-
    Dmitriy_M.
    Что за бред? Т.е. я делаю отступ(пробел ставлю) и входные данные не корректны?
    Запись от go размещена 22.03.2013 в 21:22 go вне форума
  8. Старый комментарий
    Аватар для programina
    Спасибо, все понятно написано!
    Запись от programina размещена 08.05.2013 в 09:16 programina вне форума
  9. Старый комментарий
    Аватар для -=ЮрА=-
    что за бред? Т.е. я делаю отступ(пробел ставлю) и входные данные не корректны?
    - кто сказал что алгоритм ругается на пробелы? cin>>12,56[пробел] подберёт все до \n.
    Запись от -=ЮрА=- размещена 08.05.2013 в 22:01 -=ЮрА=- вне форума
  10. Старый комментарий
    Цитата Сообщение от -=ЮрА=-
    - кто сказал что алгоритм ругается на пробелы? cin>>12,56[пробел] подберёт все до \n.
    Таки ругается, ведь cin не заберет из потока следующие за числом пробелы.
    Запись от Hrobak размещена 21.05.2013 в 16:39 Hrobak вне форума
  11. Старый комментарий
    Аватар для -=ЮрА=-
    Таки ругается, ведь cin не заберет из потока следующие за числом пробелы.
    О пробелах за числом речь и не идёт если после числа будут пробелы то ввод будет расценен как корректный. Речь о пробелах завёл go (который даже стёр свой пост, видимо стыдно стало). Вот цитата его реплики
    что за бред? Т.е. я делаю отступ(пробел ставлю) и входные данные не корректны?
    Суть была в том, что он закинул леща якобы ввод не пропустит число как корректное если после него сделать пробел.
    Нет - это не так, пробел(ы) после числа на отработку никак не влияют.
    Запись от -=ЮрА=- размещена 21.05.2013 в 23:02 -=ЮрА=- вне форума
  12. Старый комментарий
    Суть была в том, что он закинул леща якобы ввод не пропустит число как корректное если после него сделать пробел.
    Нет - это не так, пробел(ы) после числа на отработку никак не влияют.
    Попытаюсь хоть как-то разжевать. Бывает, что данные вводятся через пробел. Таким образом, если использовать Ваш "великолепный" алгоритм, то он будет давать сбой при вводе пробела до числа, хотя входные данные корректны. Плохо покрыли тестами свой код, скорее всего из-за неопытности.
    Речь о пробелах завёл go (который даже стёр свой пост, видимо стыдно стало).
    Чистить топик это Ваша прерогатива.
    Запись от go размещена 22.05.2013 в 10:04 go вне форума
  13. Старый комментарий
    Цитата Сообщение от -=ЮрА=-
    О пробелах за числом речь и не идёт если после числа будут пробелы то ввод будет расценен как корректный.
    Так речь то о том, что не будет. Пример. В первой строке 2 лишних пробела, во второй строке 1 лишний пробел, в третьей строке ничего лишнего, а четвертая не оканчивается '\n'.
    Запись от Hrobak размещена 23.05.2013 в 00:10 Hrobak вне форума
  14. Старый комментарий
    Аватар для -=ЮрА=-
    Как всегда находим какой-то полу-про онлайн ресурс и и начинаем возводить его в ранг догмы. Лично Я не уверен на 100% в начинке того онлайн компилятора, который даже на 14 без пробелов и '\n' ругался http://ideone.com/AVpwHV (что само по себе уже говорит о недоработанности Ideone)
    а четвертая не оканчивается '\n'
    - продолжая тему 14-ти - ввод без '\n' в настоящей консольке невозможен т.к ввод подразумевает нажатие Enter, которая хочешь не хочешь вставит в буфер '\n'.
    Вывод один - не пиcать и не тестировать в дерьме и не ориентироваться на компиляторы из под полы.
    Бывает, что данные вводятся через пробел.
    - а бывает данные ещё вводятся в этит бокс, где уже автоматом защита стоит. Каждой задаче своя реализация.
    https://www.cyberforum.ru/blogs/34326/blog279.html
    Запись от -=ЮрА=- размещена 23.05.2013 в 04:00 -=ЮрА=- вне форума
  15. Старый комментарий
    Цитата Сообщение от -=ЮрА=-
    14 без пробелов и '\n'
    Таки без '\n' (смотрите свою ссылку - ).
    Цитата Сообщение от -=ЮрА=-
    продолжая тему 14-ти - ввод без '\n' в настоящей консольке невозможен т.к ввод подразумевает нажатие Enter
    А вдруг глупый пользователь Ctrl+D нажмет (EOF).
    Цитата Сообщение от -=ЮрА=-
    а бывает данные ещё вводятся в этит бокс, где уже автоматом защита стоит. Каждой задаче своя реализация.
    Бывает, но это уже совсем другая история. В некоторых случаях вообще SpinBox-ом лучше обойтись. Здесь уже действительно от задачи зависит.
    Цитата Сообщение от -=ЮрА=-
    Как всегда находим какой-то полу-про онлайн ресурс и и начинаем возводить его в ранг догмы.
    Да никто его и не боготворит. Я бы никогда на него не ссылался, если на разных системах/компиляторах этот код работал бы по-разному.
    Запись от Hrobak размещена 23.05.2013 в 15:02 Hrobak вне форума
  16. Старый комментарий
    Аватар для -=ЮрА=-
    А вдруг глупый пользователь Ctrl+D нажмет (EOF).
    это приведёт к облому и в простом cin>>. М.б будем разрабатывать программу для защиты монитора от головы пьяного глупого пользователя? Вобщем этот пункт счёл бредом

    Да никто его и не боготворит. Я бы никогда на него не ссылался, если на разных системах/компиляторах этот код работал бы по-разному.
    - могу поинтересовтать под детальным расскрытием слова разных компиляторов. Уже очень интересно на чём тестировал. Уверен кроме замшелого билдера или чего-нибудь наподобие для линукса никаких тестов не проводилось, я прав?
    Запись от -=ЮрА=- размещена 23.05.2013 в 17:39 -=ЮрА=- вне форума
  17. Старый комментарий
    Цитата Сообщение от -=ЮрА=-
    это приведёт к облому и в простом cin>>. М.б будем разрабатывать программу для защиты монитора от головы пьяного глупого пользователя? Вобщем этот пункт счёл бредом
    Крайне большая проблема сделать проверку на cin.eof(), - мы же о безопасном вводе говорим, а удары головой по монитору ввод данных лично мне не напоминают, в отличии от случайного/специального нажатия Ctrl+D или Ctrl+Z или чего-то еще.
    Цитата Сообщение от -=ЮрА=-
    - могу поинтересовтать под детальным расскрытием слова разных компиляторов. Уже очень интересно на чём тестировал. Уверен кроме замшелого билдера или чего-нибудь наподобие для линукса никаких тестов не проводилось, я прав?
    GNU C++4.7.3 под Linux, который чем-то вам не угодил, и MSVC 2012 под Windows 7.
    Да и кстати, еще ваш код весело реагирует на ввод типа
    Code
    1
    
    4.56.66.65
    и скатывается в безудержное веселье при вводе случайного набора символов. Предлагаю несколько переделанный вариант
    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
    
    #include <string>
    #include <iostream>
    #include <limits>
    using namespace std;
     
    //Объявляем функцию шаблон
    //Функция вернёт ИСТИНА если параметр val был веден корректно
    //в противном случае возврат от функции ЛОЖЬ
     
    inline void streamClear (std::istream &is)
    {
        is.clear();
     
        is.ignore(numeric_limits<streamsize>::max(),'\n');
    }
     
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение которое будет сопутствовать вводу
        T &val
    );
     
    int main()
    {
        int    iVal;//Целочисленная переменная
        double dVal;//Вещественная переменная
        while(true)
        {
            if(!SafeInput("Enter integer : ",iVal))//Безопасный ввод int
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<iVal<<endl;
     
            if(!SafeInput("Enter double  : ",dVal))//Безопасный ввод double
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<dVal<<endl;
     
        }
        return 0;
    }
     
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение которое будет сопутствовать вводу
        T &val
    )
    {
        cout<<msg;//Вывод на экран сопутствующего сообщения
        //Проверка на корректный ввод должна содержать не только if(!(cin>>val) )
        //но и проверку на то что строка более не содержит символов т.е cin.get() != '\n'
        if(!(cin>>val))
        {
            streamClear(cin);
            return false;
        }
        char c;
        while (c=cin.get(),c!='\n' && !cin.eof())
            if (c!=' ')
            {
                streamClear(cin);
                return false;
            }
        cin.clear ();
        return true;
    }
    Не утверждаю, что идеальный, но, во всяком случае, работает гораздо более корректно.
    Запись от Hrobak размещена 24.05.2013 в 01:31 Hrobak вне форума
  18. Старый комментарий
    Аватар для -=ЮрА=-
    Hrobak
    1-е терпеть не могу когда люди врут
    не не напоминают, в отличии от случайного/специального нажатия Ctrl+D или Ctrl+Z или чего-то еще.
    а залей ка мне видео с OS Windows любой версии NT линейки где бы нажате Ctr+ Чего то там не привела к Incorrect input.
    Я терпеть не могу когда люди врут!

    Да и кстати, еще ваш код весело реагирует на ввод типа
    Код Code
    1
    4.56.66.65
    - вот текстовка как реагирует код
    Enter integer : 1
    Your input : 1
    Enter double : 4.56.66.65
    Incorrect input
    Enter integer :
    - подскажи после чего смеяться?
    Предлагаю несколько переделанный вариант
    - не обижайся, но
    Знаешь почему - потому, что кода в 2 раза больше стало, появилась доп функция -парень или мистер мне без, разници, возьми на вооружение вот такую древнюю поговорку -
    Если не умеешь писать просто - то ты не умеешь писать вобще.
    Можешь полистать Шилдта или Страустурпа, а лучше хабр на тему стадии развития программиста (поймёшь о чём я говорил)
    Не утверждаю, что идеальный, но, во всяком случае, работает гораздо более корректно.
    - отличий для NT я не увидел.
    Раз уж речь зашла о модернизациях, хорошо вот модернизация которая как я уверен справиться с отработкой на Х-ах, где как я понял Ctrl+D и Ctrl+Z обладают магическими свойствами в консоли
    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
    
    #include <string>
    #include <iostream>
    using namespace std;
     
    //Объявляем функцию шаблон
    //Функция вернёт ИСТИНА если параметр val был веден корректно
    //в противном случае возврат от функции ЛОЖЬ
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение котороет сопутсвовать вводу
        T &val
    );
     
    int main()
    {
        int    iVal;//Целочисленная переменная
        double dVal;//Вещественная переменная
        while(true)
        {
            if(!SafeInput("Enter integer : ",iVal))//Безопасный ввод int
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<iVal<<endl;
     
            if(!SafeInput("Enter double  : ",dVal))//Безопасный ввод int
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<dVal<<endl;
     
        }
        return 0;
    }
     
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение котороет сопутсвовать вводу
        T &val
    )
    {
        bool bOk = true;//Флаг успешного ввода
        cout<<msg;//Вывод на экран сопутсвующего сообщения
        //Проверка на корректный ввод должна сожержать не только if(!(cin>>val) )
        //но и проверку на то что строка более не содержит символов т.е cin.get() != '\n'
        //также следует учесть что пользователь мог оставить за числом хвост из пробелов
        //в этом случае нужно анализировать буффер на предмет нахождения не пробелов
        //поэтому в коде введена getline(cin, buffer)
        string buffer;
        if(!(cin>>val))
            bOk = false;
        else
        if
        (
            getline(cin, buffer) 
            ? 
            (buffer.find_first_not_of(' ') != string::npos)
            :
            cin.get() != '\n'
        )
            bOk = false;
        if(!bOk)
        {
            cin.clear();//Сброс флагов ошибок
            cin.sync();//Очистка буффера ввода
            //Если не вызвать эти два метода после некорректного ввода 1-е ошибка так и останется флагом cin::bad
            //Буфер станет генеротором символов оставшихся в нём, т.е если вместо чсла ввели строку из 5-ти символов
            //то как минимум 5-ть вводов будут неокрректными
        }
        return bOk;
    }
    Скриншот к сожалению могу прицепить на rghost (когда администрация позволит добавлю его в первый пост)
    http://rghost.ru/46234093

    Не по теме:

    Hrobak - в дальнейшем за ложь (обман за NT платформу) буду изымать твои посты, так что будь впредь пиши как оно есть, а не как ты хочешь показать людям - 2раза не предупреждаю.

    Запись от -=ЮрА=- размещена 24.05.2013 в 22:12 -=ЮрА=- вне форума
  19. Старый комментарий
    Цитата Сообщение от -=ЮрА=-
    Hrobak
    1-е терпеть не могу когда люди врут
    а залей ка мне видео с OS Windows любой версии NT линейки где бы нажате Ctr+ Чего то там не привела к Incorrect input.
    Я терпеть не могу когда люди врут!
    Во-первых, никто вам не врет. Вот так у меня: http://rghost.net/46235093. Или это уже скриншот выполнения модернизированного кода? (он действительно корректно работает на MSVC)
    Речь шла о тестировании на реакцию от последующих пробелов. Ctrl+Z в Win на MSVC даст Incorrect Input, я и не спорю, хотя было бы интересно посмотреть на реакцию MinGW.
    Цитата Сообщение от -=ЮрА=-
    - вот текстовка как реагирует код
    - подскажи после чего смеяться?
    - не обижайся, но
    Знаешь почему - потому, что кода в 2 раза больше стало, появилась доп функция -парень или мистер мне без, разници, возьми на вооружение вот такую древнюю поговорку
    Реакция на этот же код абсолютно другая у GNU C++, но ладно, забудем о кросплатформенности. 70 делить на 54 будет 2? О_о Больше на 15 строк, которые обеспечивают корректную работу на разных компиляторах.
    Цитата Сообщение от -=ЮрА=-
    Раз уж речь зашла о модернизациях, хорошо вот модернизация которая как я уверен справиться с отработкой на Х-ах, где как я понял Ctrl+D и Ctrl+Z обладают магическими свойствами в консоли
    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
    
    #include <string>
    #include <iostream>
    using namespace std;
     
    //Объявляем функцию шаблон
    //Функция вернёт ИСТИНА если параметр val был веден корректно
    //в противном случае возврат от функции ЛОЖЬ
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение котороет сопутсвовать вводу
        T &val
    );
     
    int main()
    {
        int    iVal;//Целочисленная переменная
        double dVal;//Вещественная переменная
        while(true)
        {
            if(!SafeInput("Enter integer : ",iVal))//Безопасный ввод int
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<iVal<<endl;
     
            if(!SafeInput("Enter double  : ",dVal))//Безопасный ввод int
                cout<<"Incorrect input"<<endl;
            else
                cout<<"Your input : "<<dVal<<endl;
     
        }
        return 0;
    }
     
    template <class T>
    bool SafeInput
    (
        const char * msg,//сообщение котороет сопутсвовать вводу
        T &val
    )
    {
        bool bOk = true;//Флаг успешного ввода
        cout<<msg;//Вывод на экран сопутсвующего сообщения
        //Проверка на корректный ввод должна сожержать не только if(!(cin>>val) )
        //но и проверку на то что строка более не содержит символов т.е cin.get() != '\n'
        //также следует учесть что пользователь мог оставить за числом хвост из пробелов
        //в этом случае нужно анализировать буффер на предмет нахождения не пробелов
        //поэтому в коде введена getline(cin, buffer)
        string buffer;
        if(!(cin>>val))
            bOk = false;
        else
        if
        (
            getline(cin, buffer) 
            ? 
            (buffer.find_first_not_of(' ') != string::npos)
            :
            cin.get() != '\n'
        )
            bOk = false;
        if(!bOk)
        {
            cin.clear();//Сброс флагов ошибок
            cin.sync();//Очистка буффера ввода
            //Если не вызвать эти два метода после некорректного ввода 1-е ошибка так и останется флагом cin::bad
            //Буфер станет генеротором символов оставшихся в нём, т.е если вместо чсла ввели строку из 5-ти символов
            //то как минимум 5-ть вводов будут неокрректными
        }
        return bOk;
    }
    Попробую попридираться.
    К чему заводить лишнюю строку, да и притом фактически делать лишний проход по ней, когда это можно сделать сразу? Я не говорю, что это критично, но на написание простого кода не сильно походит. Посмотрю, как G++ это скушает и отпишу.

    Не по теме:

    -=ЮрА=-, сами подумайте, какой смысл мне вас обманывать, если и так понятно, что вы работаете со студией и сможете все проверить. Вроде же даже на тролля не похож :scratch:

    Запись от Hrobak размещена 24.05.2013 в 23:29 Hrobak вне форума
  20. Старый комментарий
    Так вот, G++ реагирует так:
    1) на последующие пробелы корректно.
    2) на EOF в строке корректно.
    3) при вводе точек конечное число раз подряд выводит Incorrect Input.
    4) при вводе случайных символов бесконечно начинает выводить Incorrect Input.
    Пользователь переведен мной в бан по причине обмана
    от -=ЮрА=-
    Запись от Hrobak размещена 24.05.2013 в 23:41 Hrobak вне форума
 
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru