Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проверка на целое значение


Автор: Voldemar2004 4.11.2009, 20:39
Функция проверяет на целое значени:

Код
#include <stdlib.h>

int IsInteger(char *);

int IsInteger(char *num)
{
        char *end=num;
        strtol(num, &end, 10);
        return *end==0;
}


Но ведь целое число это и 2.000 и -2.00. Как лучше проверить это ? С помощью функции atol() ?

Автор: Pitlord 4.11.2009, 21:06
Код

#include <stdlib.h>
#include <ctype.h>

int IsInteger(char *);

int IsInteger(char *n)
{
    char point = 0;

    while( isspace(*n) ) n++;

    if( *n == '\0' )
        return 0;

    if( !isdigit(*n) && *n != '+' && *n != '-' )
        return 0;

    if( *n == '+' || *n == '-' )
        n++;

    if( *n == '\0' )
        return 0;

    while( isdigit(*n) || *n == '.' )
    {
        if( *n == '.' )
        {
            if( point )
                return 0;
            point = 1;
        }
        else if( point && *n != '0' )
            return 0;

        n++;
    }

    while( isspace(*n) ) n++;

    return ( *n == '\0' );    
}

Автор: Anikmar 4.11.2009, 23:14
Цитата(Voldemar2004 @  4.11.2009,  20:39 Найти цитируемый пост)
Но ведь целое число это и 2.000 и -2.00. Как лучше проверить это ? С помощью функции atol() ? 

В данном случае с помощью оператора if.

Задача несколько непонятна:
Нужно отмести строку, если в ней не целое число или преобразовать просто в целое - по принципу лишнее выкинуть?

Автор: 586 5.11.2009, 00:24
...

Автор: azesmcar 5.11.2009, 08:23
Код

bool IsInteger(const char *str) {
    double temp;
    return !(std::stringstream(str) >> temp).fail() && temp == (int)temp;
}

так? хотя мне самому не очень smile 

или так
Код

bool IsInteger(const char *str) {
    double tempDouble = 0;
    int tempInt = 0;

    return (!(std::stringstream(str) >> tempDouble).fail() &&
            !(std::stringstream(str) >> tempInt).fail() &&
            tempInt == tempDouble);
}


Автор: Voldemar2004 6.11.2009, 20:34
Цитата(Anikmar @  5.11.2009,  00:14 Найти цитируемый пост)
Нужно отмести строку, если в ней не целое число или преобразовать просто в целое - по принципу лишнее выкинуть?
Нет, я говорил, что нужно проверить на целое: например -2.0000 - целое, а -2.00001 - нет.

Автор: Anikmar 6.11.2009, 20:46
Если нужна функция проверки содержит ли строка валидное целое число, то наверное нужно идти по пути Pitlord - т.е. первй знак может быть либо цифра либо знаки + или -
Далее только цифры (если не нужно проверять на переполнение) и точка.
После точки допускаю.тся только нули.

можно преобразовать в double, затем double в long и посмотреть разницу между ними. Если 0 - то число целое. Но тут возможны нюансы в виде разницы 0.00000.......1

Автор: Dov 6.11.2009, 21:42
Если есть гарантия, что в строке только цифровые символы и точка, то что-нить такое...
Код

bool IsInteger(const char *str) 
{
    char * p = strchr(str, '.');

    return !p || !strpbrk(p, "123456789");
}

Автор: Anikmar 6.11.2009, 22:51
А если точки в строке нет?  smile 

Автор: Dov 6.11.2009, 23:04
Цитата(Anikmar @  6.11.2009,  21:51 Найти цитируемый пост)
А если точки в строке нет?  

значит это целое...   smile 

Автор: Anikmar 6.11.2009, 23:09
Цитата(Dov @  6.11.2009,  23:04 Найти цитируемый пост)
значит это целое...    

А просто 0?  smile 

Автор: Dov 6.11.2009, 23:13
Цитата(Anikmar @  6.11.2009,  22:09 Найти цитируемый пост)
А просто 0?

На 0 делить нельзя...  smile 

Автор: Anikmar 6.11.2009, 23:30
Цитата(Dov @  6.11.2009,  23:13 Найти цитируемый пост)
На 0 делить нельзя...   

Сдаюсь. Уболтал, черт языкастый...

Автор: Dov 6.11.2009, 23:52
Ну, слава б-гу...    smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)