2014-12-12 6 views
3

Я в основном хочу проверить, является ли строка действительной научной двойной или нет.Как проверить, является ли научная нотация двойным или нет C++

Так в основном, если линия имела характер как a или просто несколько символов, как help или 0.a то это будет рассматриваться как не научный двойной и отвергнуто, однако что-то вроде 1.234E+9 или 2.468E9 будет храниться как это Приемлемое значение

Я написал код, чтобы справиться с этим, однако мне нужна помощь ... различия между научной двойной и только некоторые символы

char *temp; 
int u=0; 
int arrayLen = strlen(temp); 
for(int i=0; i<len; i++) 
{ 
    if(isalpha(temp[i])) 
    { 
    if((temp[i] == 'e') && (!isalpha(temp[i-1]))) 
    { 
     break; 
    } 
    u++; 
    } 
} 

if(u > 0) 
{ 
    temp[0] = 0; 
    break; 
} 
+3

Используйте 'std :: stod' или его эквивалент C (' strtod'). –

+3

У вас есть возможность использовать регулярные выражения? Тогда это однострочный. – UniversE

+0

@ T.C. errr - или просто это * кашель * блестящий. Слишком легко. :-D – UniversE

ответ

2

Как 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. */ 
} 
+0

Спасибо, я думал, есть способ просто отклонить символы, так как «0.0» является действительным двойным. В настоящий момент строка преобразуется в двойную, которая дает '0.000', которая действительна, когда она не должна быть –

+0

Объясните свои критерии больше. Вы говорите, что 0.0 является недопустимым двойником? –

+0

Спасибо за ваш ответ и ответ. В принципе, я хочу хранить удвоения, такие как '0.0', а не такие символы, как' a' или './A.out'. Проблема заключается в том, что эти символы преобразуются в double и производят '0,00000', и поэтому они становятся действительными двойниками. Подводя итог, я не хочу читать никаких символов и хранить их. Я хочу, чтобы программа мгновенно распознала их как символы и не имела действительной научной двойной или просто двойной –