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 :

Initialiser une chaine de caractère


Sujet :

C

  1. #21
    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 lutin06
    Ce sont de simples warning et non des erreurs.
    Alors tu ne les corrige pas ?

    Certains de ces warnings doivent absolument être corriger. Le plus méchant étant celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     main.c:517:12: warning: unknown escape sequence '\d'
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.c: In function `menu':
    main.c:692: warning: 'NombreDeMots' might be used uninitialized in this function
    et enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.c: At top level:
    main.c:846: warning: return type of 'main' is not `int'
    Les autres peuvent être ignorés.

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 44
    Par défaut
    J'ai corrigé toutes les erreurs que vous m'avez fait remarquer, je vous en remercie.

    Mais il reste la plus embetante, celle qui m'empeche d'executer le programme.

    Quelqu'un peut il m'aider a ce sujet ?

    merci

  3. #23
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par lutin06
    Ce sont de simples warning et non des erreurs.
    Un warning n'ai jpas toujours 'simple'. Ils servent a signaler des constructions etranges qui peuvent etre source d'erreur.
    Un warning peut, dans les cas extermes, etre ignore une fois qu'il a ete correctement analyse et que la certitude qu'il ne prvoquera pas d'erreur est acquise[1].

    Sinon j'ai commence a relire et corriger le code puis je me suis arreter devant l'ampleur de la tache. En vrac plusieurs remarques :

    * Mauvaises utilisation de malloc :
    - utilisation du type plutot que de la variable pour determiner la taille
    - pas de test de la valeur retour
    - confusion frequente entre adresse et variable (ie allocation d'un pointeur et non d'un element).
    * Utilisation frequente des constantes 26 et 1000 plutot que des defines correspodant.
    * Utilisation de constantes numeriques plutot que des constantes caracteres associee (32 pour ' ', etc.).
    * Presence de nombreuses variables inutiles.
    * Utilisation d'allocation dynamique pour des tableaux de faible taille et fixe (des tableaux auraient tout aussi bien convenu)
    * Utilisation de variables automatiques de grandes tailles (la une allocation dynamique ou une variable statique auraient davantage eu leur place.
    * Utilisation de valeur en dur plutot que de sizeof (fgets(ligne,10000,fic2) devrait etre remplacer par fgets(ligne,sizeof ligne,fic2)).
    * La valeur de retour de fopen n'est pas toujours testee
    * Certains fichiers ne sont pas fermes (2 fopen et un seul fclose).
    * La memoire n'est pas toujours (voire meme rarement) liberee ==> fuite de memoire.
    * Pourquoi creer des type qui masque les pointeurs (par exemple : typedef NOEUD* TArbre ?
    * Pourquoi inclure les header standard dans arbre.h (ou ils ne sont pas utile)plutot que dans arbre.c ?
    * Les fonctions privees devraient etre static.

    Il y en a tres certainement d'autres (d'autant que je n'ai pas regarder l'algorithme pour l'instant, seulement le codage).
    En outre l'indentation n'est pas des plus agreables.

    [1] Personellement je ne suis pas patisan de cette solution qui induit un travail supplementaire et peut noyer les warning important dans les warning juges sans importance.

  4. #24
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    D'autres petites remarques :

    * Mauvaises utilisation de scanf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
          do
          {
             printf("\n\nProcedez au choix par la saisie d'un chiffre\n\n");
             printf("\t1: Lecture d'un fichier\n");
             printf("\t2: Afficher le lexique\n");
             printf("\t3: Chercher un mot\n");
             printf("\t4: Ajouter un mot\n");
             printf("\t5: Statistiques\n");
             printf("\t6: Suppression du lexique\n");
             printf("\t7: Sortir du programme\n\n");
             printf("Choix :");
             scanf("%d",&Choix);
          }
          while(Choix>6 && Choix<1);
    En cas de saisie non numerique (par exemple 'a'), on part en boucle infinie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char mot[26];
    ...
    scanf("%s",mot);
    En cas de saisie de plus de 26 caracteres ==> debordement de buffer.

    * Gestion des erreurs d'ouverture de fichier plutot originale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       fic=fopen("D:\dico2.txt","r");
       while (fic== NULL);
    Si le fichier n'est pas present, on part en boucle infinie.


    Sinon pourrais-tu fournir les fichiers texte correspondant histoire de pouvoir tester un peu.

  5. #25
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Apres avoir regarder d'un peu plus pres la fonction qui semeble te poser probleme ainsi que l'appel de cette fonction:

    * Il manque des const sur la plupart des parametres non modifies de tes fonctions.
    * Lors des manipulations de chaines de caracteres, il n'y a quasiment aucun controle de taille et de depassement buffer. Par exemple:
    - dans la fonction fcskiplist(), on lit strcpy(nouveauMot->mot,motaAjoute), que ce passe-t-il si nouveauMot->mot n'a pas la taille suffisante (en outre on ne sit meme pas en l'etat du code si l'allocation a reussie) ?
    - dans menu() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0;i<26;i++)
    {
       tabChar2[i] = 0;
    }
    i=0;
    Ici, on initialise bien le tableau sur l'ensembl de la taille (quoique TAILLE_MAX_MOT a la place de 26 aurait ete preferable).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while((ligne[k]>64 && ligne[k]<91) || (ligne[k]>96 && ligne[k]<123))
    {
       tabChar2[i]=ligne[k];
       if(ligne[k]>64 && ligne[k]<91) 
       {
          tabChar2[i]=ligne[k]+32;
       }
       i++;
       k++;
    }
    Mais ici on ne verifie plus la taille, il y a risque de debordement de buffer.

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    personellement pour le malloc je met toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc(sizeof(*str) * (strlen(str + 1)))
    comme cela je peux copier la nouvelle chaine et mettre un '\0' a la fin

  7. #27
    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 PiXi-PiX
    personellement pour le malloc je met toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc(sizeof(*str) * (strlen(str + 1)))
    comme cela je peux copier la nouvelle chaine et mettre un '\0' a la fin
    Tel quel, il va te manquer 2 caractères !

    Et tu peux retirer les parenthèses inutiles avec sizeof quand c'est objet.

    Tu veux dans doute dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc (sizeof *str * (strlen (str) + 1))
    (je pense qu'on s'est tous fait piégés au moins une fois là-dessus...)

    Voir plutôt strdup(). C'est pas standard C, mais POSIX.1, donc très portable...

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Oui dsl je me suis tromper dans mes '()'

    :oops

    ca ne coute rien de recode un strdup

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. [SSE] Initialiser un DOM XML à partir d'une chaine de caractères ?
    Par nd786mar1 dans le forum Eclipse Platform
    Réponses: 5
    Dernier message: 16/12/2010, 17h02
  3. Réponses: 3
    Dernier message: 17/12/2003, 11h26
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  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