将字符串用户输入转换为双

时间:2016-01-18 15:19:02

标签: c

我需要知道如何将用户输入(字符串)转换为double。就像他在字符串" 23.45"中写道一样,它转换为双23.45 (没有任何库函数)。

我已经获得了整数代码,但不知道如何继续使用double:

#include <stdio.h>

void main()
{
    char input[100];
    printf("Type a String which will be converted to an Integer: ");
    scanf("%s", input);

    int number = 0;
    int i = 0;

    if (input[i] >= 48 && input[i] <= 57)
    {
        while (input[i] >= '0' && input[i] <= '9')
        {
            number = number * 10;
            number = number + input[i] - '0';
            i++;
        }
        printf("string %s -> number %d \n", input, number);
    }
    else
    {
        printf("Enter a number! \n");
    }
}

4 个答案:

答案 0 :(得分:1)

可能没有理由为您推出自己的版本,因为stdlib.h中的strtod已经涵盖了各种格式。

这是一个涵盖带符号数字作为输入的版本,并提供了一些可以放置更合适的错误处理的提示:

#include <stdbool.h>

static void halt_and_catch_fire (void);

double strtod_homebrewn (const char* str)
{
  double result = 0;

  // handle signs:  
  bool is_negative = false;
  if(*str == '-')
  {
    is_negative = true;
    str++;
  }
  else if(*str == '+')
  {
    str++;
  }

  // handle the dot position:
  bool is_dot_found = false;
  double multiplier = 0.1;

  // the actual conversion:
  for(const char* s=str; *s!='\0'; s++)
  {
    if(*s >= '0' && *s <= '9') // ctype.h isdigit() would be preferred here
    {
      if(is_dot_found)
      {
        result += (*s - '0') * multiplier;
        multiplier /= 10;
      }
      else
      {
        result *= 10;
        result += *s - '0';
      }
    }
    else if(*s == '.')
    {
      if(is_dot_found) // two dots?
      {
        halt_and_catch_fire(); // replace this with error handling
      }

      is_dot_found = true;
    }
    else if(*s != '\0') // all cases tested, some weird unknown character found
    {
      halt_and_catch_fire(); // replace this with error handling
    }
  }


  if(is_negative)
  {
    result = -result;
  }

  return result;
}

static void halt_and_catch_fire (void)
{
  halt_and_catch_fire();
}

答案 1 :(得分:0)

编辑:仅对小数点后的小数位使用此方法。 阅读评论,了解为什么它会因大量数字而失败。

由于您提到不使用任何库函数,您可以执行类似的操作。

float number;
int decimal = 0;
int decimal_found =10;
while(input[i]!='\0')
{
    if((input[i] <='0' || input[i] >='9')&&input[i]!='.' )
    break;

    if(input[i] == '.')
    decimal = 1;

    if(decimal == 1)
    {
        number = number + (input[i] - '0')/decimal_found;
        decimal_found = decimal_found*10;
    }
    else
    {
        number =  number *10;
        number = number + input[i] - '0';
    }
    i++;
}

只需检查一个十进制变量,知道何时达到十进制,然后使用和if else为数字变量设置单独的条件

答案 2 :(得分:0)

编辑:正如clux指出的那样,当分数以零开始时,这会失败。游民。无论如何,也许有人设想了一个简单的解决方案?我只能想到添加&#34; readzeroes()&#34;功能,让它在点之后运行。

你已经有了读取int的函数。只需使用它。伪代码:

float read_float()
{
    float f = read_int()
    if(next is dot) skipdot else return f;
    float frac = read_int() 
    while (frac>1) frac /= 10
    return f+frac;
}

答案 3 :(得分:0)

#include <stdio.h>

void main()
{
    char input[100];
    printf("Type a String which will be converted to a double: ");
    scanf("%s", input);

    double number = 0.0;
    double divider = 1.0;
    int inFraction = 0;
    int i = 0;

    if (input[i] >= 48 && input[i] <= 57)
    {
        inFraction = 0;
        while ((input[i] >= '0' && input[i] <= '9') || input[i] == '.')
        {
            if (input[i] == '.')
            {
                i++;
                inFraction = 1;
                continue;
            }

            number = number * 10.0;
            number = number + input[i] - '0';
            i++;

            if (inFraction) divider *= 10.0;
        }

        number /= divider;

        printf("string %s -> number %g \n", input, number);
    }
    else
    {
        printf("Enter a number! \n");
    }
}