c语言字符串与 浮点型,判断输入字符串是不是为浮点数

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

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

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值