On m'a demandé d'écrire un programme pour trouver une somme de deux entrées à mon collège, donc je devrais d'abord vérifier si l'entrée est valide. p>
Par exemple, si j'entraîne 2534.111s35 code> Le programme doit détecter qu'il ne s'agit pas d'une entrée valide pour ce programme en raison de
s code> dans l'entrée. P>
4 Réponses :
Vous devez prendre l'entrée en tant que string em> puis utiliser concernant les valeurs de retour, à partir du page man : p> strTOD () code>
pour analyser l'entrée.
double strtod(const char *nptr, char **endptr);
mais ma préoccupation est de détecter ce caractère supplémentaire et de le conserver invalide pour le programme
@sachinmirajkar Oui, vous devez vérifier le contenu de * endptr code> - En cas de succès, il devrait indiquer la null de terminaison, car il n'y aurait plus rien dans l'entrée à convertir. Si la conversion a échoué à mi-chemin - il ne sera pas dirigé vers un caractère nul.
@saurav Ghosh Il serait utile que vous puissiez se démogorer avec un petit exemple ou toute référence pour trouver un exemple de merci
@chux vient de mettre à jour la réponse pour clarifier, espérons que cela devrait être correct maintenant.
Mieux encore, "la valeur de retour n'est pas énorme_val code>". est absent. Cette préoccupation ne s'applique pas lorsque
errno code> reste 0. Aussi
errno == Erange code> signifie que la conversion a fonctionné dans cette entrée est numérique, juste hors de portée. Jusqu'à OP si cela est "valide".
Notez également errno == Erange code> et
fabs (résultat) <= dbl_min code> peut se produire.
strtod () code> est un gâchis dans les petits coins.
Pour vérifier l'entrée est numérique (flotteur) p>
1) Prenez l'entrée en tant que chaîne
Char BUF [BIG_EUGH] CODE>. Je m'attendrais à ce que 160 chiffres gèrent tous les cordes de "flotteur" les plus arcaniques 1 sup>. P>
xxx pré> 2) appliquer
flotteur strtof ( ) code> pour
float code>, (
strtod () code> pour
double code>,
strtold () code> pour
pour
Long double code>). p>
xxx pré> 3) Vérifiez les résultats. P>
if (buf == endptr) return "No_Conversion"; // Recommend to tolerate trailing white-space. // as leading white-spaces are already allowed by `strtof()` while (isspace((unsigned char)*endptr) { endptr++; } if (*endptr) return "TrailingJunkFound"; return "Success";
#include<stdio.h> #include<stdlib.h> void main(){ char num1[15]; float number1; int dot_check1=0,check=0,i; printf("enter the numbers :\n"); gets(num1); i=0; while(num1[i]){ if(num1[i]>'/' && num1[i]<':') ; else { if(dot_check1==0){ if(num1[i]=='.') dot_check1=1; else { check=1; break; } } else { check=1; break; } } i++; } if(check){ printf("please check the number you have entered"); } else{ number1=atof(num1); printf("you entered number is %f",number1); } }
J'ai fait cette suggestion ou une amélioration nécessaire? \
Ce code a un comportement non défini si la ligne d'entrée dépasse 14 caractères. (Il n'y a presque pas d'utilisation correcte de obtient code>; ne l'utilisez pas.) Ce code assume ASCII, et inutilement, comme on pouvait comparer avec
'0' code> et
'9' code> ou simplement utiliser
isdigit code> à partir de
Comme je suis débutant, je ne suis pas en mesure de comprendre les solutions ci-dessus, il y a une explication plus simple dans tout article ou vedio pour référence
monsieur j'ai vérifié iSDigit code> fonction de
entiers code> pas
float code> variables
Voici le code non testé pour vérifier si une chaîne répond à la spécification demandée.
#include <ctype.h> /* IsFloatNumeral returns true (1) if the string pointed to by p contains a valid numeral and false (0) otherwise. A valid numeral: Starts with optional white space. Has an optional hyphen as a minus sign. Contains either digits, a period followed by digits, or both. Ends with optional white space. Notes: It is unusual not to accept "3." for a float literal, but this was specified in a comment, so the code here is written for that. The question does not state that leading or trailing white space should be accepted (and ignored), but that is included here. To exclude such white space, simply delete the relevant lines. */ _Bool IsFloatNumeral(const char *p) { _Bool ThereAreInitialDigits = 0; _Bool ThereIsAPeriod = 0; // Skip initial spaces. (Not specified in question; removed if undesired.) while (isspace(*p)) ++p; // Allow an initial hyphen as a minus sign. if (*p == '-') ++p; // Allow initial digits. if (isdigit(*p)) { ThereAreInitialDigits = 1; do ++p; while (isdigit(*p)); } // Allow a period followed by digits. Require at least one digit to follow the period. if (*p == '.') { ++p; if (!isdigit(*p)) return 0; ThereIsAPeriod = 1; do ++p; while (isdigit(*p)); } /* If we did not see either digits or a period followed by digits, reject the string (return 0). */ if (!ThereAreInitialDigits && !ThereIsAPeriod) return 0; // Skip trailing spaces. (Not specified in question; removed if undesired.) while (isspace(*p)) ++p; /* If we are now at the end of the string (the null terminating character), accept the string (return 1). Otherwise, reject it (return 0). */ return *p == 0; }
si (* p == '.') {if (! isdigit (* p)) retour 0; L 'ailed = 1; faire ++ p; tandis que (isdigit (* p)); } code>
Ici vous testez sans chiffres, c'est un personnage, cela pourrait être n'importe quoi comme n'importe quel caractère non seulement . code> pour que ce soit quoi faire?
@sachinmirajkar: Il y avait un ++ p code> manquant. Je l'ai édité. Une fois qu'une période est reconnue, le code teste si le caractère suivant est un chiffre. Si ce n'est pas le cas, cela indique une erreur. Si c'est le cas, il accepte ce caractère et les caractères chiffres suivants.
puis-je utiliser cela après Scanf
Ce sera utile si vous démontrez un exemple
Voir ici, Stackoverflow.com/ Questions / 15229411 / ...
Dupliqué possible de validation d'entrée d'un entier utilisant ATOI ()
Examiner soigneusement strTOD (3) - page manuelle Linux Notant i> la section "Valeur de retour" i> puis créer votre validations b> pour vérifier chacun, par exemple
nptr! = endptr code>, que
errno code> est zéro et en particulier si
(* endptr && * endptr! = '\ n') code> - le final vous indiquant que les caractères non chiffrés restent après la conversion terminée.
Tout d'abord, nous devons savoir ce que vous entendez par "numérique (flotteur)". Si nous suivons la définition C des constantes de point flottant, nous pourrions accepter des "chiffres en option-période en option en option-exponent", où l'un des deux "chiffres" doit être non vide et que l'exposant en option est "e en option chiffres non vides "ou" e "au lieu de" E ". Nous pourrions également accepter un trait d'union comme un signe moins avant le nombre (C ne le fait pas, dans le code source, pour des raisons techniques impliquant la syntaxe et la grammaire, mais vous le souhaitez peut-être. Nous ne savons pas; vous devez dire. ) Peut-être que vous souhaitez également accepter des numéros de points flottants hexadécimaux.
Il y a aussi une question de savoir quoi faire si l'entrée est syntaxiquement d'un nombre valide mais est mathématiquement trop grand (ou petit) pour représenter. Voulez-vous rejeter cela dans ce code, ou peut-être l'accepter, mais prenez sa valeur comme l'infini ou signalez une erreur (de taille plutôt que la syntaxe) à l'utilisateur?
Numérique (flotteur) signifie que l'entrée peut être float, mais elle doit être valide pour l'exemple 3.45638 est valide et 3.4S638 n'est pas (Becuase il contient un charactère dedans "S") afin que je souhaite afficher cela comme un message erro
(a) Le nombre peut-il avoir un
- code> avant de cela; est
-3 code> une entrée valide? (b) est
3. code> une entrée valide? (c) est
.3 code> une entrée valide? (d) le nombre peut-il avoir un exposant? est
3e4 code> une entrée valide? e) L'exponent peut-il utiliser une capitale E au lieu de minuscules; est
3e4 code> une entrée valide? (f) Le nombre peut-il avoir un
f code> de
f code> suffixe comme dans le code source C; est
3f code> une entrée valide? (g) Le nombre peut-il avoir un
l code> ou
l code> suffixe comme dans le code source C; est
3.l code> une entrée valide? (h) le nombre peut-il utiliser un format hexadécimal de point flottant; est
0x3.4a5p-7 code> une entrée valide? (i) sont des autres formes acceptables?
Merci pour votre temps SIR A) Oui, `-3` est valide. b) non,
3. code> n'est pas valide c) Oui,
.3 code> est valide et devrait faire l'objet d'un
0 code> avant D) N ° ne peut pas être exponentiel e) non f) je suis incapable d'obtenir ces points g) c'est aussi je ne reçois pas h) non son seul décimal i) comme pour l'instant seulement ce point que je considère
Sachin Mirajkar, besoin de quelque chose d'autre pour une réponse acceptable?