ulvis.paste.net

Paste Search Dynamic
Recent pastes
string number
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <math.h>
  5.  
  6. #define MAXLINE 500
  7. #define UNDEF -1
  8.  
  9. double atof(char str[]);
  10.  
  11. int main()
  12. {
  13.         char str[MAXLINE];
  14.         printf("\n  Enter string with number: ");
  15.         gets(str);
  16.         printf("\n\n");
  17.         double x = atof(str);
  18.         if (x == 0)
  19.                 printf("  number not found\n");
  20.         else
  21.                 printf("  result: %lf\n", x);
  22. }
  23.  
  24. double atof(char str[])
  25. {
  26.         int begin_position = UNDEF, dot_position = UNDEF, end_position = UNDEF, pow_position = UNDEF;
  27.  
  28.         for (int i = 0; i < strlen(str); i++)
  29.         {
  30.                 if (str[i] == '.')
  31.                 {
  32.                         dot_position = i;
  33.                         break;
  34.                 }
  35.         }
  36.  
  37.         for (int i = 0; i < ((dot_position == UNDEF) ? strlen(str) : dot_position); i++)
  38.         {
  39.                 if (isdigit(str[i]))
  40.                 {
  41.                         begin_position = i;
  42.  
  43.                         break;
  44.                 }
  45.         }
  46.  
  47.         end_position = strlen(str) - 1;
  48.         for (int i = begin_position; i < strlen(str); i++)
  49.         {
  50.                 if (!isdigit(str[i]) && str[i] != '.')
  51.                 {
  52.                         end_position = i - 1;
  53.                         break;
  54.                 }
  55.         }
  56.         if (dot_position != UNDEF)
  57.         {
  58.                 if ((str[end_position + 1] == 'e' || str[end_position + 1] == 'E'))
  59.                         pow_position = end_position + 2;
  60.         }
  61.  
  62.         double result;
  63.         long result_before_dot = 0;
  64.         double result_after_dot = 0;
  65.         int scale = 0;
  66.         short sign = 1;
  67.  
  68.         if (begin_position != UNDEF)
  69.         {
  70.                 if (str[begin_position - 1] == '-')
  71.                         sign = -1;
  72.         }
  73.         else
  74.         {
  75.                 if (str[dot_position - 1] == '-')
  76.                         sign = -1;
  77.         }
  78.  
  79.         if (begin_position != UNDEF)
  80.                 for (int i = begin_position; i < (dot_position == UNDEF ? end_position + 1 : dot_position); i++)
  81.                         result_before_dot = result_before_dot*10 + (str[i] - '0');
  82.  
  83.         if (dot_position != UNDEF)
  84.         {
  85.                 for (int i = end_position; i > dot_position; i--)
  86.                         result_after_dot = result_after_dot/10.0 + (str[i] - '0');
  87.                 result_after_dot /= 10;
  88.         }
  89.  
  90.         result = (result_before_dot + result_after_dot)*sign;
  91.  
  92.         if (pow_position != UNDEF)
  93.         {
  94.                 if (str[pow_position] == '-')
  95.                         ++pow_position;
  96.                 for (int i = pow_position; isdigit(str[i]); i++)
  97.                         scale = scale*10 + (str[i] - '0');
  98.                 if (str[pow_position - 1] == '-')
  99.                         scale *= -1;
  100.                 result *= pow(10, scale);
  101.                 printf("%lf", pow(10, scale));
  102.         }
  103.  
  104.         return result;
  105. }
Parsed in 0.014 seconds