Проверка числового формата C++

Тема в разделе "LANGS.C", создана пользователем shock_X, 2 дек 2008.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    shock_X
    можешь посмотреть нек моменты в моей старой теме по схожему вопросу:
    http://www.rsdn.ru/Forum/?mid=2857791
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Без функции, которая "просмотрит" всю введенную строку, не обойтись. Читай строку с консоли, не число. И затем сделай функцию: сначала смотришь если есть минус - если есть, то продвигаешь адрес - пропуская этот минус и затем все символы должны быть цифрами:
    Код (Text):
    1. int IsNumeric (char* s)
    2. {
    3.     if (*s == '-')
    4.     {
    5.         s++;
    6.     }
    7.  
    8.     char ch;
    9.     while ((ch = *s++) != 0)
    10.     {
    11.         if (! isdigit (ch))
    12.         {
    13.             return 0; // Not a valid format
    14.         }
    15.     }
    16.     return 1; // All digits
    17. }
    Доработай там, наверное, так как, например: "+76" не будет определено как верный формат. Ну или, например: "-8273463764874798437" будет определено как верный, хотя конвертирование вернёт ошибку переполнения.
     
  3. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Можно заюзать boost::lexical_cast. Он сначала выводит один тип в поток (std::ostream) а потом выводит другой из потока. Ежели чего не сработало кидает boost::bad_lexical_cast. И для того чтобы свои типы приводить к разным типам надо переопределить операторы << (std::ostream &,...), >> (std::istream &). Естественно способ не самый быстрый.

    Код (Text):
    1. int x = boost::lexical_cast<int, std::string>("1234");
    2. std::string str = boost::lexical_cast<std::string, double>(x);
     
  4. facelift

    facelift New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2008
    Сообщения:
    25
    Сорри, уже было
     
  5. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    Да, вариантов много, но ничего не помогает.
    может подскажите что сделать/прописать, чтобы в нижеследующем коде не было зацикливания.
    Код (Text):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. int main ()
    5. {
    6.     int test;
    7.     do // этот цикл получается "бесконечным", если ввели не число
    8.     {
    9.         system("cls");
    10.         printf("i=");
    11.         scanf("%d", &test);
    12.     }
    13.     while (test<-100 || test>100);
    14.     printf ("i=%d", test);
    15.     return 0;
    16. }
    И ещё вопрос. Оператор scanf("%d", &test); сканирует целое число со знаком. А это не подразумевает, что он будет сканировать только целое число? Ведь символы ввести тоже можно, а из-за них происходит зацикливание...
     
  6. Clear_Energy

    Clear_Energy Алексей

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    375
    Проверяй на наличие символов и фильтруй их...
     
  7. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    Clear_Energy
    Я с первого поста этой темы прошу в этом помочь. Если б я знал как это делать, я бы стал здесь писать?!
     
  8. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    Тема ещё актуальна, больше нет вариантов?..
     
  9. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Ахо А., Сети Р., Ульман Д. "Компиляторы. Принципы, технологии, инструменты"
     
  10. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    Внес изменения в программу, решил одну проблему, появилась другая...
    Ниже код функции, в которой осуществляется ввод числа и проверка диапазона и числового формата (алгоритм тут -> http://www.wasm.ru/forum/viewtopic.php?pid=282111#p282111):
    Код (Text):
    1. int EnterWithCheck(int& test)
    2. {
    3.     bool NoError;
    4.     do
    5.     {
    6.         system("cls");
    7.         NoError=true;
    8.         cout << "Введите число от -100 до 100 ";
    9.         cin >> test;
    10.         cout << "Нажмите 'Enter' для продолжения" << endl;
    11.         system("pause");
    12.         if (cin.good())
    13.         {
    14.             cin.ignore(10, '\n'); // и расскажите плз что значат цифры в этой строке
    15.             break;
    16.         }
    17.         cin.clear();
    18.         cin.ignore(10, '\n');
    19.         if (test < -100 || test > 100)
    20.         {
    21.             NoError=false;
    22.             ErrorScreen(); // сообщение об ошибке
    23.         }
    24.     }
    25.     while (NoError==false);
    26.     return test;
    27. }
    Далее в программе эта функция используется трижды, т.е. получаем три переменные для дальнейшего использования: test1, test2, test3.
    Переменная test2 не равна test1, а переменная test3 не равна test2 и не равна test1.
    Когда используем функцию первый раз - то при вводе знаков (не чисел) программа не ругается, а когда используется второй и третий раз - то ругается (опять же, если ввести знаки). Вопрос - почему так?
     
  11. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    Решил задачу, изменив алгоритм.
    Тему можно закрывать, но напоследок...
    2 Johnikum:
    А чем мне помогла бы книга - Ахо А., Сети Р., Ульман Д. "Компиляторы. Принципы, технологии, инструменты" ? :)
    Я же не спрашивал как работают компиляторы, вопрос был совершенно другой :)
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    shock_X
    попробую ответить за уважаемого Johnikum:
    тем, что в этой книге, как минимум рассмотрена задача лексического анализа (читай: парсинга). как раз то, что тебе нужно.
     
  13. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    varnie
    ну смысл того, что мне нужно сделать я понимаю. На паскале я могу реализовать это запросто. Но с Си++ я имею дело только 2 месяца. А как показала данная тема + множество других тем на разных сайтах и форумах -- решить одну задачу можно не то что разными способами, а используя совершенно разные функции... Спасибо тем, кто помог в той или иной мере, кто сказал какие можно использовать функции, но... по моему начальному алгоритму решения я не нашёл, поэтому пришлось его переделать, используя уже полученные навыки и знания.
     
  14. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    shock_X
    раз спрашиваешь - значит книгу не читал...
    там есть разбор выражений в том числе и числовых

    varnie
    именно
     
  15. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    no message
     
  16. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    shock_X
    с каких это пор?
    может из-за того, что ты пытаешся с помощью "^" возводить в степень, а компилятор по стандарту считает xor ;)
     
  17. shock_X

    shock_X New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2008
    Сообщения:
    40
    no message
     
  18. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    shock_X
    возводить в квадрат xor'ом !? инересно! можно примерчик?