Ввод чисел в консольных приложениях

Для решения задач на C++ в приложениях с консольным интерфейсом возникает необходимость корректного ввода чисел с возможностью исправления. Числовые значения могут быть целочисленными и вещественными (иметь десятичную дробь), положительными и отрицательными.В данной статье рассматриваются две функций, одна из которых служит для ввода только целых положительных чисел, а другая функция позволяет ввести число с плавающей точкой и знаком «минус». Обе функции позволяют корректировать вводимые числа.Максимально-допустимые значения чисел, которые можно ввести с помощью этих функций, ограничены в одном случае максимальным значением 32-разрядного целого числа без знака, а в другом случае - длиной строки.Реализация этих функций в Visual C++ 2005 выглядит так:

#include "stdafx.h"
#include <conio.h>
#include <limits.h>
 
unsigned InputInteger()
{
      const int _key_back     (0x08);
      const int _key_enter    (0x0D);
      _TCHAR text[16] = _T(""), limit[16];
      size_t max_len = _stprintf_s(limit, _T("%u"), UINT_MAX);
      //
      int pos = 0;
      bool _exit = false;
      while (!_kbhit() && !_exit)
      {
            int ch = _gettch();
            if (pos == max_len && ch != _key_back && ch != _key_enter)
                  continue;
            //
            switch (ch)
            {
                  case _key_enter : // Enter
                        _exit = true;
                        break;
                  case _key_back :  // Back
                        if (pos > 0)
                        {
                             text[--pos] = '\0';
                             _tprintf(_T("\b \b"));
                        }
                        break;
                  default :   // Any key
                        if (_istdigit(ch) > 0)
                        {
                             text[pos++] = ch, text[pos] = '\0';
                             if ((pos == max_len) && (_tcscmp(text, limit) > 0))
                             {
                                   text[--pos] = '\0';
                             } else
                             {
                                   _tprintf(_T("%c"), ch);
                             }
                        }
                        break;
            }
      }
      //
      unsigned result = 0;
      _stscanf_s(text, _T("%u"), &result);
      return result;
}
 
double InputDouble()
{
      const int _key_back     (0x08);
      const int _key_enter    (0x0D);
      int p = 0;
      bool end_line = false;
      TCHAR _str[32] = _T("");
      int max_len = sizeof(_str)/sizeof(TCHAR)-1;
      //
      while (!end_line)
      {
        int ch = _gettch();
        if (p == max_len && ch != _key_enter && ch != _key_back)
            continue;
            if (ch == '.' && _tcschr(_str, '.') != NULL)
                  continue;
            if (ch == '-' && _str[0] != '\0')
                  continue;
            switch (ch)
            {
            case _key_enter :  
                end_line = true;
                break;
            case _key_back :   
                if (p > 0)
                {
                    _str[--p] = '\0';
                    _tprintf(_T("\b \b"));
                }
                break;
            default:
                if (_istdigit(ch) > 0 || ch == '.' || ch == '-')
                {
                    _str[p++] = ch;
                    _str[p] = '\0';
                    if (p == max_len)
                    {
                        _str[--p] = '\0';
                    } else
                    {
                        _tprintf(_T("%c"), ch);
                    }
                }
                break;
            }
      }
      //
      return _tstof(_str);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
      _cputts(_T("Ввод целого числа: "));
      unsigned val = InputInteger();
      _cputts(_T("\r\n"));
      _tcprintf(_T("Число = %d\r\n"), val);
      //
      _cputts(_T("Ввод дробного числа: "));
      double num = InputDouble();
      _cputts(_T("\r\n"));
      _tcprintf(_T("Число = %f\r\n"), num);
      //
      _gettch();
      return 0;
}