2 qq 24371913 qq_24371913 于 2014.12.09 20:17 提问

c语言 判断输入的值是否为浮点数

如题

1.可能输入字符串
2.可能输入ip地址

自己试着做了一下,但是输入ip地址(如1.1.1.1)的时候往往忽略第二个小数点后的内容,直接显示输入正确
求教

9个回答

habit_reflection
habit_reflection   2014.12.09 21:59

他们的回答好复杂啊,你可以把整个当成一个字符串,然后以 . 截取,然后判断是否能转成数字类型,能就是ip,不能就包含字符创

wangyaninglm
wangyaninglm   Ds   Rxr 2014.12.09 20:41

浮点数可以由以下的正则表达式确定:

white_space_opt     [[:space:]]*
digit_sequence      [[:digit:]]+
fractional_constant   {digit_sequence}\.?|\.{digit_sequence}|{digit_sequence}\.{digit_sequence}
exponent_part         [eE][+-]?{digit_sequence}
floating_constant   {fractional_constant}{exponent_part}*
accepted_input      {white_space_opt}[+-]?{floating_constant}{white_space_opt}

---------------------------------------------
如果不接受 1 2 3 这样的数为浮点数, 则fractional_constant应该是  {digit_sequence}\.|.....
如果不接受 浮点数两端加的空格,则 accepted_input 应该是 [+-]?{floating_constant}
---------------------------------------------
你可以用你稀饭的正则表达式库,如posix regex , pcre , boost::regex 啥的做这件事,也可以用其对应的 DFA 做判断, 比如这样

#include <stdio.h>

int is_floating_constant( const char* input )
{
static const int yy_accept[21] =
    {   0,
        0,    0,    3,    2,    2,    2,    2,    1,    0,    0,
        0,    1,    1,    1,    1,    0,    1,    0,    1,    0
    } ;

static const int yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    2,
        2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    3,    1,    3,    4,    1,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    6,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        6,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static const int yy_meta[7] =
    {   0,
        1,    2,    1,    1,    3,    1
    } ;

static const int yy_base[24] =
    {   0,
        0,    0,   27,   28,    5,    7,    0,   11,    0,    0,
        0,    0,   16,    0,   21,   20,    0,    0,   19,   28,
       17,   17,   11
    } ;

static const int yy_def[24] =
    {   0,
       20,    1,   20,   20,   20,   20,   21,   20,    5,    6,
       21,    8,   20,   22,   13,   20,   15,   23,   15,    0,
       20,   20,   20
    } ;

static const int yy_nxt[35] =
    {   0,
        4,    5,    6,    7,    8,    4,    9,   10,   11,   12,
       11,   12,   14,   19,   15,   12,   16,   14,   14,   13,
       13,   16,   18,   19,   19,   17,   20,    3,   20,   20,
       20,   20,   20,   20
    } ;

static const int yy_chk[35] =
    {   0,
        1,    1,    1,    1,    1,    1,    5,    5,    5,    5,
        6,    6,    8,   23,    8,    8,    8,   13,   22,   21,
       13,   13,   16,   19,   16,   15,    3,   20,   20,   20,
       20,   20,   20,   20
    } ;

    enum { last_dfa = 19 , jambase = 28 };

    int curr = 1 , c ;
    do {
        if( 0 == *input )
            break;
        c = yy_ec[*(unsigned char*)input];
        if( 1 == yy_accept[curr] && 0 == input[1] )
            return 1;
        while( yy_chk[ yy_base[curr] + c ] != curr )
            if( (curr=yy_def[curr] ) >= last_dfa + 2 )
                c = yy_meta[c];
        curr = yy_nxt[ yy_base[curr] + c ];
        ++input;
    }  while( yy_base[curr] != jambase );

    return 0;
}

int main()
{
    char input[80+1] = "";
    while( fgets( input , 80 , stdin ) )
    {
        if( is_floating_constant( input ) )
            printf( "YES\n" );
        else
            printf( "NO\n" );
    }
    return 0;
}

wangyaninglm
wangyaninglm   Ds   Rxr 2014.12.09 20:41

浮点数可以由以下的正则表达式确定:

white_space_opt     [[:space:]]*
digit_sequence      [[:digit:]]+
fractional_constant   {digit_sequence}\.?|\.{digit_sequence}|{digit_sequence}\.{digit_sequence}
exponent_part         [eE][+-]?{digit_sequence}
floating_constant   {fractional_constant}{exponent_part}*
accepted_input      {white_space_opt}[+-]?{floating_constant}{white_space_opt}

---------------------------------------------
如果不接受 1 2 3 这样的数为浮点数, 则fractional_constant应该是  {digit_sequence}\.|.....
如果不接受 浮点数两端加的空格,则 accepted_input 应该是 [+-]?{floating_constant}
---------------------------------------------
你可以用你稀饭的正则表达式库,如posix regex , pcre , boost::regex 啥的做这件事,也可以用其对应的 DFA 做判断, 比如这样

#include <stdio.h>

int is_floating_constant( const char* input )
{
static const int yy_accept[21] =
    {   0,
        0,    0,    3,    2,    2,    2,    2,    1,    0,    0,
        0,    1,    1,    1,    1,    0,    1,    0,    1,    0
    } ;

static const int yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    2,
        2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    3,    1,    3,    4,    1,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    6,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        6,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static const int yy_meta[7] =
    {   0,
        1,    2,    1,    1,    3,    1
    } ;

static const int yy_base[24] =
    {   0,
        0,    0,   27,   28,    5,    7,    0,   11,    0,    0,
        0,    0,   16,    0,   21,   20,    0,    0,   19,   28,
       17,   17,   11
    } ;

static const int yy_def[24] =
    {   0,
       20,    1,   20,   20,   20,   20,   21,   20,    5,    6,
       21,    8,   20,   22,   13,   20,   15,   23,   15,    0,
       20,   20,   20
    } ;

static const int yy_nxt[35] =
    {   0,
        4,    5,    6,    7,    8,    4,    9,   10,   11,   12,
       11,   12,   14,   19,   15,   12,   16,   14,   14,   13,
       13,   16,   18,   19,   19,   17,   20,    3,   20,   20,
       20,   20,   20,   20
    } ;

static const int yy_chk[35] =
    {   0,
        1,    1,    1,    1,    1,    1,    5,    5,    5,    5,
        6,    6,    8,   23,    8,    8,    8,   13,   22,   21,
       13,   13,   16,   19,   16,   15,    3,   20,   20,   20,
       20,   20,   20,   20
    } ;

    enum { last_dfa = 19 , jambase = 28 };

    int curr = 1 , c ;
    do {
        if( 0 == *input )
            break;
        c = yy_ec[*(unsigned char*)input];
        if( 1 == yy_accept[curr] && 0 == input[1] )
            return 1;
        while( yy_chk[ yy_base[curr] + c ] != curr )
            if( (curr=yy_def[curr] ) >= last_dfa + 2 )
                c = yy_meta[c];
        curr = yy_nxt[ yy_base[curr] + c ];
        ++input;
    }  while( yy_base[curr] != jambase );

    return 0;
}

int main()
{
    char input[80+1] = "";
    while( fgets( input , 80 , stdin ) )
    {
        if( is_floating_constant( input ) )
            printf( "YES\n" );
        else
            printf( "NO\n" );
    }
    return 0;
}

fenujing
fenujing   2014.12.09 20:41

先判断小数点的个数,然后判断小数点两边的是不是字符

eagleyan
eagleyan   Rxr 2014.12.10 03:42

正则表达式^[-+]?[0-9]*.?[0-9]+$,
怎么用正则表达式
http://www.lemoda.net/c/unix-regex/

xiangshimoni
xiangshimoni   2014.12.10 13:25

用点号进行字符串分割

w810443616
w810443616   2014.12.10 16:54

直接当成字符串输入,判断有多少个小数点呗,多于一个,判断小数点个数是不是四个,如果不是就既不是浮点数也不是IP地址,小数点数只有一个,并且小数点的位置不是字符串第一个,就是浮点数

xiaohuoxiaoer
xiaohuoxiaoer   2014.12.11 10:44

直接当成字符串输入,判断有多少个小数点呗,
一、多于一个,判断小数点个数是不是四个,如果不是就既不是浮点数也不是IP地址,
二、小数点数只有一个,并且小数点的位置不是字符串第一个,就是浮点数
三、小数点是4个时,判断是否符合IP地址的形式,符合则为IP地址,否则不是。

zxh707wk
zxh707wk   Rxr 2014.12.11 20:05
 #include <stdio.h>

int main()
{
    float num;
    scanf("%f",&num);
    if(getchar()!='\n')
    {
        printf("输入错误\n");
    }
    else
    {
        if((int)num*1.0!=num)printf("输入错误\n");
        else printf("输入正确\n");
    }
    return 0;
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!