Как TC предположим, используйте 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; /* Prepare a pointer for strtod to inform us where it ended extracting the double from the string. */
*retval = strtod(num, &endptr); /* Run the extraction of the double from the source string (num) and give us the value so we can store it in the address given by the caller (retain the position in the string where strtod stopped processing). */
if(endptr == NULL)
return 0; /* endptr should never be NULL, but it is a defensive programming to prevent dereferencing null in the next statement. */
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'). –
У вас есть возможность использовать регулярные выражения? Тогда это однострочный. – UniversE
@ T.C. errr - или просто это * кашель * блестящий. Слишком легко. :-D – UniversE