Partage
  • Partager sur Facebook
  • Partager sur Twitter

zIdentificator

Exercice de niveau intermédiaire

    1 juillet 2010 à 23:36:02

    quentin-fait-du-c > J'ai regardé vite fait (je ne l'ai pas testé donc je ne sais pas si il marche bien) :

    for(i=0;i<strlen(word);i++) /*test pour la validité des caractères.*/
    
    Pas du tout performant, le mieux c'est de tester avec for(i=0; word[i] != 0; i++). Ou de directement incrémenter le pointeur.

    if(*word == 0 || word==NULL) /*est-ce un mot??*/
    
    Ce test arrive trop tard, tu as déjà segfault (met le au tout début).

    Et perso je mettrai des return 0; au lieu de flag=0 un peu partout.

    Citation : quentin-fait-du-c

    (des if dans des for c'est mauvais parait-il),

    Je ne vois pas pourquoi ce serait mauvais.



    • Partager sur Facebook
    • Partager sur Twitter
      2 juillet 2010 à 10:14:41

      Bonjour vous :)
      => Meteor2 J'ai lu je sais plus où que l'idée d'imbriquer des tests dans une boucle c'était un très bon moyen d'augmenter de façon logarithmique la durée d'exécution du programme.
      C'est peut-être que j'ai mal compris ou peut-être une erreur. Ou un autre contexte ^^
      En tout cas merci, je vais aller voir en essayant d'incrémenter le pointeur (puisque word[i] != 0 devrait justement me renvoyer 0). Pour les Return partout, j'ai vu tout le monde le faire mais je croyais que c'était pas bon de faire ça ^^ Encore des conneries, je vais m'économiser un flag. Merci :)

      EDIT: Hé ben j'ai l'air idiot, je crois que la solution "incrémenter le pointeur" est interdite parce que mes tableaux sont en const char* ^^
      • Partager sur Facebook
      • Partager sur Twitter
        2 juillet 2010 à 11:50:31

        Citation : quentin-fait-du-c

        => Meteor2 J'ai lu je sais plus où que l'idée d'imbriquer des tests dans une boucle c'était un très bon moyen d'augmenter de façon logarithmique la durée d'exécution du programme.

        Ca me semble bizarre ça, je pense que tu as du mal comprendre en effet (ou sinon cite ta source ;) ).

        Citation : quentin-fait-du-c

        EDIT: Hé ben j'ai l'air idiot, je crois que la solution "incrémenter le pointeur" est interdite parce que mes tableaux sont en const char* ^^

        Non, tu confonds.

        const char* signifie que le pointeur n'a pas le droit de modifier la chaîne sur laquelle il pointe. Par contre tu as le droit de le faire pointeur sur une autre chaîne (tu peux donc l'incrémenter).

        char* const c'est l'inverse.

        const char * const c'est les deux.
        • Partager sur Facebook
        • Partager sur Twitter
          2 juillet 2010 à 17:22:33

          Citation

          const char* signifie que le pointeur n'a pas le droit de modifier la chaîne sur laquelle il pointe. Par contre tu as le droit de le faire pointeur sur une autre chaîne (tu peux donc l'incrémenter).

          char* const c'est l'inverse.

          const char * const c'est les deux.



          et la derniere forme est equivalente a char const * const
          • Partager sur Facebook
          • Partager sur Twitter
            2 juillet 2010 à 18:48:56

            Merci vous deux pour la précision :) Je maitrise mal les instructions const et static (pour ne citer qu'elles), dans mes tests j'ai du mal écrire la syntaxe :)

            Je vais aller chercher un peu sur le net pour arranger ça, je préfèrerais ça fait plus "langage C" (et puis ça me fera apprendre un truc et ça, c'est cool !)

            Merci pour vos commentaires tout le monde, j'attends les prochains exos :)
            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2010 à 19:00:48

              Citation : quentin-fait-du-c

              Je maitrise mal les instructions const et static



              const et static ne sont pas des instructions ;)

              On dit que :

              -- const est un spécificateur (ou spécifieur)
              -- static est un qualifieur.

              Ce sont aussi des mots-clés.

              Citation : quentin-fait-du-c

              Je maitrise mal les instructions const et static (pour ne citer qu'elles), dans mes tests j'ai du mal écrire la syntaxe :)



              Il n'y a pas que la syntaxe, il y a aussi la sémantique.

              const est difficile à bien comprendre. static moins et est de nature différente.
              • Partager sur Facebook
              • Partager sur Twitter
                3 juillet 2010 à 20:17:57

                Bonjour, j'ai trouvé une solution:


                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                #include <ctype.h>
                
                int iskeyword(const char *str)
                {
                    static const char *keywords[] =
                    {
                        "auto", "break", "case", "char", "const", "continue", "default",
                        "do", "double", "else", "enum", "extern", "float", "for", "goto",
                        "if", "inline", "int", "long", "register", "restrict", "return",
                        "short", "signed", "sizeof", "static", "struct", "switch",
                        "typedef", "union", "unsigned", "void", "volatile", "while"
                    };
                    const char **it = keywords;
                    for(; *it; it++)
                    {
                        if(!strcmp(str, *it))
                        {
                            return 1;
                        }
                    }
                    return 0;
                }
                
                int zIdentificator(const char *str)
                {
                    if(iskeyword(str) || (str[0] == '_' && (str[1] == '_' || isupper(str[1]))) || isdigit(str[0]) || !*str)
                    {
                        return 0;
                    }
                    for(; *str; str++)
                    {
                        if(!isalnum(*str) && *str != '_')
                            return 0;
                    }
                    return 1;
                }
                
                int main()
                {
                    static const char *test_strings[] =
                    {
                        "toto", "toto42", "Toto", "c", "to", "_", "_t", "_toto", "_bool",
                        "_4", "_42_toto", "", "4", "42", "4_", "to-to", "__", "__toto",
                        "_Toto", "____", "goto", "return", "_Bool"
                    };
                    const char **it = test_strings;
                    for(; *it; it++)
                    {
                        printf("%s\t\t: %d\n", *it, zIdentificator(*it));
                    }
                    return 0;
                }
                



                Par contre j'ai une question : Ma fonction iskeyword ne fonctionne pas si je ne mets pas de NULL à la fin de mon tableau de mots-clé (logique, l'itérateur n'a pas forcément de valeur où s'arrêter). Par contre, si je le déclare static, même sans mettre de NULL à la fin, tout fonctionne bien et je ne comprends pas pourquoi (non pas que je me plaigne que tout fonctionne :D mais quand même)
                • Partager sur Facebook
                • Partager sur Twitter
                  3 juillet 2010 à 22:34:35

                  Désolé pour le vocabulaire Candide, c'est une des nombreuses choses qu'il me reste à apprendre en C.
                  Pour le moment je fais de l'algo, il faut que je me revoie tout ça à tête reposée :p Mais j'y viendrais, ça ne saurait tarder.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  zIdentificator

                  × 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.
                  • Editeur
                  • Markdown