Comment scanf seulement entier et répétez la lecture si l'utilisateur entre des caractères non numériques?
Ici est un peu jeune tyro de problème avec du code C en essayant simplement d'empêcher l'utilisateur de taper un caractère ou un nombre entier inférieur à 0 ou supérieur à 23 ans.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char *input;
char *iPtr;
int count = 0;
int rows;
printf("Enter an integer: ");
scanf("%s", input);
rows = strtol(input, &iPtr, 0);
while( *iPtr != '#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char *input;
char *iPtr;
int count = 0;
int rows;
printf("Enter an integer: ");
scanf("%s", input);
rows = strtol(input, &iPtr, 0);
while( *iPtr != '\0') //Check if any character has been inserted
{
printf("Enter an integer between 1 and 23: ");
scanf("%s", input);
}
while(0 < rows && rows < 24) //check if the user input is within the boundaries
{
printf("Select an integer from 1 to 23: ");
scanf("%s", input);
}
while (count != rows)
{
/* Do some stuff */
}
return 0;
}
') //Check if any character has been inserted
{
printf("Enter an integer between 1 and 23: ");
scanf("%s", input);
}
while(0 < rows && rows < 24) //check if the user input is within the boundaries
{
printf("Select an integer from 1 to 23: ");
scanf("%s", input);
}
while (count != rows)
{
/* Do some stuff */
}
return 0;
}
Je l'ai fait à mi-parcours et un petit push up sera appréciée.
source d'informationauteur 7kemZmani
Vous devez vous connecter pour publier un commentaire.
Utilisation
scanf("%d",&rows)
au lieu descanf("%s",input)
Cela vous permet d'obtenir directement la valeur de l'entier à partir de stdin, sans besoin de les convertir à l'int.
Si l'utilisateur d'entrer une chaîne de caractères contenant un non caractères numériques, alors vous devez nettoyer votre stdin avant la prochaine
scanf("%d",&rows)
.votre code pourrait ressembler à ceci:
Explication
1)
Cela signifie d'attendre de l'entrée de l'utilisateur un entier et près de lui un non caractère numérique.
Exemple1: Si l'utilisateur d'entrer
aaddk
et puisENTER
le scanf renvoie 0. Rien captedExemple2: Si l'utilisateur d'entrer
45
et puisENTER
le scanf sera de retour 2 (2 éléments sont capted). Ici%d
est capting45
et%c
est capting\n
Exemple3: Si l'utilisateur d'entrer
45aaadd
et puisENTER
le scanf sera de retour 2 (2 éléments sont capted). Ici%d
est capting45
et%c
est captinga
2)
Dans le exemple1: cette condition est
TRUE
parce que scanf retour0
(!=2
)Dans le exemple2: cette condition est
FALSE
parce que scanf retour2
etc == '\n'
Dans l'exemple3: cette condition est
TRUE
parce que scanf retour2
etc == 'a' (!='\n')
3)
clean_stdin()
est toujoursTRUE
parce que le retour de la fonction toujours1
Dans le exemple1: La
(scanf("%d%c", &rows, &c)!=2 || c!='\n')
estTRUE
donc, la condition après la&&
doit être vérifié si l'clean_stdin()
sera exécuté, et l'ensemble de la condition estTRUE
Dans le exemple2: La
(scanf("%d%c", &rows, &c)!=2 || c!='\n')
estFALSE
donc, la condition après la&&
ne sera pas vérifiée (parce que ce que jamais son résultat est l'ensemble de l'état de laFALSE
) de sorte que leclean_stdin()
ne sera pas exécuté et l'ensemble de la condition estFALSE
Dans l'exemple3: La
(scanf("%d%c", &rows, &c)!=2 || c!='\n')
estTRUE
donc, la condition après la&&
doit être vérifié si l'clean_stdin()
sera exécuté, et l'ensemble de la condition estTRUE
De sorte que vous pouvez remarquer que
clean_stdin()
sera exécuté uniquement si l'utilisateur d'entrer une chaîne de caractères contenant des caractères numériques.Et cette condition
((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())
sera de retourFALSE
seulement si l'utilisateur d'entrer uninteger
et rien d'autreEt si la condition
((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())
estFALSE
et lainteger
est entre et1
et23
puis lewhile
boucle pause d'autre de lawhile
boucle continuera%[^0-9]
dansscanf()
engloutit tout ce qui n'est pas entre0
et9
. Fondamentalement, il nettoie le flux d'entrée de chiffres et la met dansstr
. Ainsi, la longueur de la non-séquence de chiffres est limité à 100. La suite%d
sélectionne que des nombres entiers dans le flux d'entrée et le place dansnum
.Vous pouvez créer une fonction qui lit un nombre entier compris entre 1 et 23 ou retourne 0 en cas de non-int
par exemple
Vous devrez répéter votre appel à
strtol
à l'intérieur de votre boucles d'où vous demandez à l'utilisateur d'essayer de nouveau. En fait, si vous faites la boucle undo { ... } while(...);
au lieu de tout, que vous n'aurez pas le même genre de répéter les choses deux fois le comportement.Vous devez également le format de votre code, de sorte qu'il est possible de voir où le code est dans une boucle et pas.
MOHAMED, votre réponse est grand et il m'a vraiment aidé. Ici, j'ai posté un code, que je pense que c'est un peu plus simple:
Dans mon cas, je veux que ce nombre est positif. Si vous souhaitez que votre numéro entre 1 et 23, vous remplacez le
number<0
avecnumber<1 || number>23
dans le si déclaration. Aussi, vous devrez changer leprintf
pour imprimer un message approprié.Si l'entrée est numéro, vous pouvez utiliser
foo
comme entrée.