IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

savoir si une chaine ne comporte que des lettres


Sujet :

C

  1. #1
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut savoir si une chaine ne comporte que des lettres
    existe il en C une fonction toute faite qui previent si une chaine est faites uniquement de lettre ou non ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    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

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    salut,
    non mais si tu cumules les fonctions isdigit(), isspace() etc... tu peux te faire ta propre fonction.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salseropom
    salut,
    non mais si tu cumules les fonctions isdigit(), isspace() etc... tu peux te faire ta propre fonction.
    ou plutôt isalpha()...

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    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.

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Top chrono 10h08

    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;
    }
    Top chrono 10h10

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Moi, je serais du genre à faire plus goret mais plus évident:
    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;
    }
    Évidemment, ça bafoue le principe "Single Entry, Single Exit". Mais pour ce genre de fonction, ça me parait plus lisible...
    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.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    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

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    ç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 :

    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;
    }
    Have fun

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gege2061
    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;
    }
    Have fun
    Hé hé !
    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

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    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

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trap D
    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;
    }
    Absolument, mais si on se la joue g33k, faut assumer...

    Evidemment, je ne recommande pas ça aux débutants.

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    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

  14. #14
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    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.

  15. #15
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    ok, merci à tous, je ne connaissais pas du tout isalpha...

    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.
    j'ai deja fais une fonction qui recherche en fonction des codes ascii avec un "||" pour majuscule ou minuscule...
    je demandais ca a titre d'information...

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lunixinclar
    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.
    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.

  17. #17
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Delahaye dit que le stardard ASCII a un rapport avec la portabilité.

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation 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 ...

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Absolument, mais si on se la joue g33k, faut assumer...

    Evidemment, je ne recommande pas ça aux débutants.
    Il vaut mieux assumer, en effet, car avec ce que tu as donné, on obtient

    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
    Avec des variations dans les résultats, selon ce qu'on a fait avant, ou que l'on change l'ordre des appels.

    En clair, un comportement indéterminé, dû au s++ qui se fait également lors du dernier test, celui qui termine la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (isalpha (*s++));
    s est incrémenté une fois de trop

    Il faut corriger:
    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;
    }
    Desormais on obtient le bon résultat,

    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).

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thewho
    Il vaut mieux assumer, en effet, car avec ce que tu as donné, on obtient
    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
    Avec des variations dans les résultats, selon ce qu'on a fait avant, ou que l'on change l'ordre des appels.
    Rhooooooooo! Et moi, ce soir, j'ai ça :
    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 alpha
    En clair, un comportement indéterminé,
    On peut le dire... Bien vu.

    Ben voilà, j'ai voulu faire le malin, ça m'apprendra...

    Allez, je ne suis plus à ça près :
    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);
    }
    Ca me rappele un truc de quand j'étais petit, léger et sans lunettes...

    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment savoir si une chaine contient des lettres
    Par developpeur_débutant dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/05/2009, 12h28
  2. Réponses: 35
    Dernier message: 25/06/2008, 16h50
  3. Réponses: 4
    Dernier message: 20/02/2006, 00h33
  4. Réponses: 20
    Dernier message: 07/12/2005, 15h32
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo