Convertir une entrée utilisateur Ssortingng en double

J’ai besoin de savoir comment convertir une entrée utilisateur, qui est une chaîne, en double. comme s’il écrivait dans la chaîne “23.45”, il convertit en double 23.45 ( sans aucune fonction de bibliothèque ).

J’ai déjà ce code pour l’entier, mais je ne sais pas comment continuer avec double:

#include  void main() { char input[100]; printf("Type a Ssortingng 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 Ssortingng 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"); } } 

Il n’y a probablement aucune raison pour que vous déploieriez votre propre version de ceci, car strtod dans stdlib.h couvre déjà toutes sortes de formats.

Voici une version qui couvre les nombres signés en entrée et donne des indications sur les endroits où une gestion des erreurs plus appropriée pourrait être placée:

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

Edit: Comme clux l’a fait remarquer, cela échoue lorsque la fraction commence par des zéros. Bummer. Quoi qu’il en soit, peut-être que quelqu’un conçoit une solution simple? Je ne peux que penser à append une fonction “readzeroes ()” et laisser cela courir après le point.

Vous avez déjà une fonction pour lire un int. Utilisez simplement ça. Pseudo code:

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

Éditer: utilisez cette approche uniquement pour un petit nombre de chiffres après le signe décimal. Lisez les commentaires pour savoir pourquoi cela échouerait pour un grand nombre de chiffres.

Puisque vous avez mentionné sans utiliser aucune fonction de la bibliothèque, vous pouvez faire quelque chose comme ceci.

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

Cochez simplement une variable décimale pour savoir quand le nombre décimal a été atteint, puis utilisez et si vous voulez avoir des conditions distinctes pour la variable numérique