existe il en C une fonction toute faite qui previent si une chaine est faites uniquement de lettre ou non ?
existe il en C une fonction toute faite qui previent si une chaine est faites uniquement de lettre ou non ?
Non.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
salut,
non mais si tu cumules les fonctions isdigit(), isspace() etc... tu peux te faire ta propre fonction.
ou plutôt isalpha()...Envoyé par salseropom
en même temps parcourir une chaine et verifier chaque caractère c'est pas comme si c'était infaisable
le temps que t as perdu a chercher une fonction toute faite et a demander sur le forum aurait suffit a faire une petite 50 aine de fois cette fonction a la main.
Top chrono 10h08
Top chrono 10h10
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 #include <ctype.h> int is_str_alpha (const char * s) { int ok; int k; int c; /* note : placer la bonne locale si on veut aussi trouver les caracteres accentués */ for (k = 0, ok = 1; ok && (c = s[k]) != '\0'; k++) { ok = isalpha(c); } return ok; }
Moi, je serais du genre à faire plus goret mais plus évident:
Évidemment, ça bafoue le principe "Single Entry, Single Exit". Mais pour ce genre de fonction, ça me parait plus lisible...
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 #include <ctype.h> int is_str_alpha (const char * s) { int c; size_t i; /* note : placer la bonne locale si on veut aussi trouver les caracteres accentués */ for (i=0 ; (c = s[i]) != '\0' ; i++) { if( ! isalpha(c) ) return 0; } return 1; }
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.
Ma mouture
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <ctype.h> int is_str_alpha (const char * s) { /* note : placer la bonne locale si on veut aussi trouver les caracteres accentués */ while (*s && isalpha(*s)) s++; return (*s == 0); }
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
ça ne me dérange pas de faire le travail à ta place mais tu risque de réfléchir plus longtemps à mon code que si tu l'avais fait toi même :
Have fun
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include <ctype.h> int str_isalpha (const char *s) { for (; isalpha (*s); s++); return !*s; }![]()
Hé hé !Envoyé par gege2061
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 #include <ctype.h> int str_isalpha (const char *s) { while (isalpha (*s++)); return !*s; } #ifdef TEST #include <stdio.h> #define UNIT_TEST(s)\ printf ("'%s' %s\n", s, str_isalpha(s) ? "is alpha" : "is not alpha") int main (void) { UNIT_TEST (""); UNIT_TEST ("ab2cd"); UNIT_TEST ("abcd"); UNIT_TEST ("abCd"); UNIT_TEST ("àbCd"); return 0; } #endif
Je croyais que tu était contre ce genre d'écriture![]()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int str_isalpha (const char *s) { while (isalpha (*s++)); return !*s; }
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Absolument, mais si on se la joue g33k, faut assumer...Envoyé par Trap D
Evidemment, je ne recommande pas ça aux débutants.
J'avais essayé d'être un peu pédago dans la geekitude![]()
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
Un caractère ASCII est une lettre si sa représentation ASCII est entre 65 et 90 inclus, ou entre 97 et 122 inclus. Je dis ça pour celui qui n'a pas envie d' inclure ctype.h. Bienvenue dans la programmation de bas niveau.
ok, merci à tous, je ne connaissais pas du tout isalpha...
j'ai deja fais une fonction qui recherche en fonction des codes ascii avec un "||" pour majuscule ou minuscule...en même temps parcourir une chaine et verifier chaque caractère c'est pas comme si c'était infaisable
le temps que t as perdu a chercher une fonction toute faite et a demander sur le forum aurait suffit a faire une petite 50 aine de fois cette fonction a la main.
je demandais ca a titre d'information...
Aucun intérêt. Le C a justement un niveau d'abstraction qui permet d'éviter ce genre d'embrouilles malfaisantes, et ce sont précisément les fonctions de <ctype.h>. Tant qu'il existe une solution portable, il n'y a aucune raison d'écrire du code non portable.Envoyé par Lunixinclar
Delahaye dit que le stardard ASCII a un rapport avec la portabilité.
Mais c'est supair ... pas clair ce que tu dis ...Envoyé par Lunixinclar
Il vaut mieux assumer, en effet, car avec ce que tu as donné, on obtientEnvoyé par Emmanuel Delahaye
Avec des variations dans les résultats, selon ce qu'on a fait avant, ou que l'on change l'ordre des appels.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 '' is not alpha 'ab2cd' is not alpha 'abcd' is not alpha 'abCd' is not alpha 'ÓbCd' is not alpha
En clair, un comportement indéterminé, dû au s++ qui se fait également lors du dernier test, celui qui termine la boucle
s est incrémenté une fois de trop
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (isalpha (*s++));
Il faut corriger:
Desormais on obtient le bon résultat,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int str_isalpha (const char *s) { while (isalpha (*s++)); --s; return !*s; }
SAUF QUE, comme les autres solutions proposées, même si elles marchent, on renvoie is alpha pour une chaîne vide, ce qu'intuitivement je pense être faux (c'est un peu comme si on disait "ceci est une bouteille de vin" en voyant une bouteille vide, sans autre information).
Rhooooooooo! Et moi, ce soir, j'ai ça :Envoyé par thewho
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 '' is not alpha 'ab2cd' is not alpha 'abcd' is not alpha 'abCd' is not alpha 'ÓbCd' is alphaOn peut le dire... Bien vu.En clair, un comportement indéterminé,
Ben voilà, j'ai voulu faire le malin, ça m'apprendra...
Allez, je ne suis plus à ça près :
Ca me rappele un truc de quand j'étais petit, léger et sans lunettes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int str_isalpha (const char *s) { while (isalpha (*s++)); return !*(s-1); }
Dans la revue 01 (je crois) dans les années 90, en dernière page, il y avait un concours ouvert de BASIC "Le 2lignes". Il fallait faire le maximum de choses plus ou moins utiles en 2 lignes de BASIC (le vrai 10 GOTO 10 poilu et tatoué, pas le truc de tapettes avec des fonctions et des paramètres). C'était assez rigolo...
J'y crois pas :
http://www.phenixinformatique.com/se...icle&artid=217
Partager