Coucou la famille!! svp j'ai besoin d'aide avec mon programme. En fait ce que je veux c'est que le scanf prenne en compte que des nombres entiers non signés. Mais quand j'execute, avec un nombre negatif ou à virgule ça s'execute
#include <stdio.h>
int Verifier(char n[])
{
int t=1,i;
for(i=0;n[i]!='\0';i++)
{
if(((n[i]>='0')&&(n[i]<='9')))
t=1;
else
t=-1;
}
return t;
}
void Saisir(char n[])
{
do
{
printf("Donner votre âge: \n");
scanf("%s",n);
}
while(Verifier(n)==-1);
}
int main()
{
char ch[80];
Saisir (ch);
printf("Ah vous avez donc %s ans",ch);
}
Normalement, quand quelqu'un te demande de vérifier une fonction, il y a de fortes chances pour que celle-ci ne fasse pas ce que nous supposons que tu attends de cette fonction.
Si on ne testait jamais rien sous prétexte que ça devrait normalement fonctionner, alors normalement, rien ne devrait fonctionner.
Edit : un petit conseil : Quand tu fouilles dans tes poches et que tu finis par trouver ce que tu cherches, continues-tu à fouiller les poches restantes ?
Fais ce que edgarjacobs a probablement fait ... Englobes ta boucle avec des { ... } (pour englober le if) et fais un printf de n[i] et de t à la fin )dans la boucle).
Oh desolé, vraiment je n'ai pas su comment dérouler c'est pourquoi j'ai parlé comme ça. Sorry, mais avec l'explication de @PierrotLefou j'ai compris mieux comment s'est fait le déroulement. Thanks!! Mais je me disais que comme dans ma boucle while, j'ai utilisés dans le code ascii que les termes allant de '0' à '9', le programme ne devrait pas retourner un nombre négatif. puisque le terme '-' n'est pas dans ma boucle, du coût je me dis qu'il devrait retourner un "Donner votre âge" à chaque fois qu'il rencontre un '-' comme il le fait avec les autres termes comme '@', '*'...
- Edité par L_oiseau_rouge 1 juillet 2022 à 6:17:50
> du coût je me dis qu'il devrait retourner un "Donner votre âge" à chaque fois qu'il rencontre un '-' comme il le fait avec les autres termes comme '@', '*'...
Chaque fois qu'il rencontre autre chose qu'un chiffre. A moins qu'on ignore aussi les espaces (c'est sympa pour une saisie utilisateur).
Te reste plus qu'à le programmer, du coup, que je me dis.
- Edité par michelbillaud 1 juillet 2022 à 12:19:59
Puise que L_oiseau_rouge part sur une saisie récupérée sous forme de chaîne, on peut aussi utiliser scanf() avec la classe de caractères [0-9] pour n'obtenir que des chiffres.
La validation se fait alors :
en vérifiant que scanf retourne bien 1 (si 0, cela signifie que le premier caractère n'est pas dans ceux permis)
et si scanf() retourne 1, en vérifiant avec getchar() que le caractère suivant est bien un '\n' (sinon, cela signifie que la saisie est suivie de caractères qui ne sont pas dans ceux permis)
Cela donne ceci :
#include <stdio.h>
void clear_stdin(void) {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
void saisir_entier_naturel(char n[]) {
while (1) {
if (scanf("%79[0-9]", n) == 1) {
if (getchar() == '\n')
return;
else
n[0] = '\0';
}
printf("Erreur de saisie\n");
clear_stdin();
}
}
int main(void) {
char ch[80] = { '\0' };
printf("Donner votre âge :\n");
saisir_entier_naturel(ch);
printf("Ah vous avez donc %s ans\n", ch);
return 0;
}
J'ai ajouté un spécificateur de taille à scanf() pour ne pas dépasser la capacité du tableau de char et une fonction vidant le buffer de stdin. Compilé et exécuté :
$ gcc -Wall -Wextra 94577636.c
$ ./a.out
Donner votre âge :
-12
Erreur de saisie
12.23
Erreur de saisie
12,45
Erreur de saisie
12
Ah vous avez donc 12 ans
En restant dans l'esprit du code de L_oiseau_rouge, il y a au minimum trois manières de coder la fonction de vérification (j'ai remplacé le return d'un entier par un booléen)
Chapeau rouloude, je n'ai pas réussi à le mettre en défaut ton code.
Contôle de saisie en C
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Bonhomme !! | Jeu de plateforme : Prototype.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent