Ben non. Tu n'as rien purgé du tout. Si on ne sait pas utiliser scanf(), le mieux est d'apprendre à le faire ou de ne pas l'utiliser.Envoyé par kamouminator
Ben non. Tu n'as rien purgé du tout. Si on ne sait pas utiliser scanf(), le mieux est d'apprendre à le faire ou de ne pas l'utiliser.Envoyé par kamouminator
La norme dit que le comportement de fflush() n'est défini que pour les flux sortants. Or stdin est à l'évidence un flux entrant. Le comportement n'est donc pas défini. C'est tout. Le code est donc incorrect.Envoyé par kamouminator
Le fait que 'ça marche' est une des possibilité d'un comportement indéfini. Ca ne signifie pas que le code est correct.
(En fait, sous Linux, "ça ne marche pas" et des cas de plantages ont été rapportés).
j'essaye donc de la même façon de ne prendre qu'une chaine de caractères minuscules dans la variable chaine
mais il me retourne une erreur de segmentation et il accepte n'importe quelle chaîne...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 int saisie(){ char chaine[30]; int ok = 0; int retour; printf("Chaine en minuscules à inserer ? \n"); while ( !ok ){ retour = scanf("%s%[a-z][^\n]", chaine); printf("retour : %d\n", retour); if ( !retour ){ /* erreur de saisie, on vide le flux */ int c; while ( ((c = getchar()) != '\n') && c != EOF); printf("Perdu, il faut rentrer uniquement des minuscules ! \n"); printf("Une autre chance ? \n"); } else { /* reussite de la saisie */ getchar(); /* on enleve le '\n' restant */ printf("saisie acceptee\n"); ok = 1; /* sort de la boucle */ printf("%s", chaine); } } return 1; }
C'est normal que tu ne limites pas la taille ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Oui. Je ne vois rien pour la limiter dans le scanf()...
PS: Tu as sûr qu'il faut deux "%" dans le format ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Je vois 2 "%" et 1 variable... C'est là que ça dépasse ma compréhension et que j'utilise fgets(), islower() etc.Envoyé par tomasi
en testant la valeur de sortie ?
je peut utiliser islower pour convertir des majuscules si jamais l'utilisateur en rentre mais que faire pour les autres caractères ? (entiers, ect...)
kékidi ?Envoyé par tomasi
je peut utiliser islower pour convertir des majuscules![]()
![]()
islower() ne convertit rien. Il teste. Pour convertir, c'est tolower()...
C'est trop pour mon neurone, là. Ca part dans tout les sens...si jamais l'utilisateur en rentre mais que faire pour les autres caractères ? (entiers, ect...)
Alors 1 problème à la fois. Que veux-tu faire exactement ?
tester si la chaine rentrée par l'utilisateur est bien une chaine de caractères minuscules
tester si on a aucune majuscule (on considere qu'on peut avoir des caracteres speciaux):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int IsMaj(char *str) { for (int i = 0; str[i]; i++) { if (str[i]>= 'A' && str[i] <= 'Z') return (-1); } return (1); }
Bonjour,
je vais rajouter mon grain de sel
Pour les fainéant de mon genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int isLowerStr(const char *s) { while (*s && islower(*s)) { s++; } return (*s == 0); }
on utilise de cette manière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int checkCharTypeStr(const char *s, int (*ctype)(char)) { while (*s && ctype(*s)) { s++; } return (*s == 0); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char *text = "le papa de marie fume la pipe"; checkCharTypeStr(text, islower); checkCharTypeStr(text, isalpha);
Pas portable. Il y a isupper() pour ça...Envoyé par toxycyty
Une boucle avec islower() de <ctype.h>Envoyé par tomasi
Partager