正如T.C.建议的那样,使用strtod函数。但要检查返回指针以查看它是否读取了所有内容。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
double convert_number( const char * num )
{
char * endptr = 0;
double retval;
retval = strtod( num, &endptr );
return ( !endptr || ( *endptr != '\0' ) ) ? 0 : retval;
}
int main( int argc, char ** argv )
{
int index;
for( index = 0; index < argc; ++index )
printf( "%30s --> %f\n", argv[index], convert_number( argv[index] ) );
return 0;
}
例子:
./a.out 13.2425 99993.3131.1134 13111.34e313e2 1313e4 1 324.3 "2242e+3"
./a.out --> 0.000000
13.2425 --> 13.242500
99993.3131.1134 --> 0.000000
13111.34e313e2 --> 0.000000
1313e4 --> 13130000.000000
1 --> 1.000000
324.3 --> 324.300000
2242e+3 --> 2242000.000000
--------------------按请求的替代方案-----------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int convert_number( const char * num, double * retval )
{
char * endptr = 0;
*retval = strtod( num, &endptr );
return ( !endptr || ( *endptr != '\0' ) ) ? 0 : 1;
}
int main( int argc, char ** argv )
{
int index;
double dvalue;
for( index = 0; index < argc; ++index )
if( convert_number( argv[index], &dvalue ) )
printf( "%30s --> %f\n", argv[index], dvalue );
else
printf( "%30s --> Rejected\n", argv[index], dvalue );
return 0;
}
结果:
./a.out 13.2425 99993.3131.1134 13111.34e313e2 1313e4 1 324.3 "2242e+3" 0.0
./a.out --> Rejected
13.2425 --> 13.242500
99993.3131.1134 --> Rejected
13111.34e313e2 --> Rejected
1313e4 --> 13130000.000000
1 --> 1.000000
324.3 --> 324.300000
2242e+3 --> 2242000.000000
0.0 --> 0.000000
新手版:
int convert_number( const char * num, double * retval )
{
char * endptr = 0;
*retval = strtod( num, &endptr );
if( endptr == NULL )
return 0;
else if( *endptr != '\0 ) /* If we are pointing to a non-null character, then there was an invalid character that strtod did not accept and stopped processing. So it is not only a double on the line. So we reject. */
return 0; /* Not strictly the double we are looking for. */
/* else */
return 1; /* Return 1 to the caller to indicate truth (non-zero) that the value in *retval has valid double value to use. */
}
std::stod
或其 C 语言等效函数strtod
。 - T.C.std::istringstream
和适当的I/O操纵符怎么样? - πάντα ῥεῖ