Convertir la entrada de usuario de cadena a un doble

Necesito saber cómo convertir una entrada de usuario, que es una cadena, a un doble. como si él escribe en la cadena “23.45”, se convierte en doble 23.45 ( sin ninguna función de biblioteca ).

Ya obtuve este código para entero, pero no sé cómo continuar con el doble:

#include  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] = '0' && input[i]  number %d \n", input, number); } else { printf("Enter a number! \n"); } } 

 #include  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"); } } 

Es probable que no haya ninguna razón por la que puedas desplegar tu propia versión de esto, ya que strtod en stdlib.h ya cubre todo tipo de formatos.

Aquí hay una versión que cubre los números firmados como entrada y tiene algunas sugerencias de dónde se podría colocar un manejo de errores más adecuado:

 #include  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(); } 

Edición: como señaló clux, esto falla cuando la fracción comienza con ceros. Gorrón. De todos modos, tal vez alguien conciba una solución simple? Solo puedo pensar en agregar una función “readzeroes ()” y dejar que se ejecute después del punto.

Ya tienes una función para leer un int. Simplemente usa eso. Pseudo código:

 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; } 

Editar: solo use este método para una pequeña cantidad de dígitos después del punto decimal. Lea los comentarios para saber por qué fallaría para una gran cantidad de dígitos.

Como mencionaste sin usar ninguna función de biblioteca, podrías hacer algo como esto.

 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++; } 

Simplemente marque una variable decimal para saber cuándo se ha alcanzado el decimal, luego use y, si no, para tener condiciones separadas para la variable numérica