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 :

Problème avec tableau de chaine de caractères


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Par défaut Problème avec tableau de chaine de caractères
    mon souci c'est d'ajouter des chaines dans mon tableau ( chaine de longueur variable ) .

    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
     
     
     char *saisie; 
        char * Tableau[10];
        int i = 0;
        int choix;
        int position1;
        int position2;
        int position;
     
        printf("Entrez le %d er  ",i+1);
        scanf("%s",&saisie);
        Tableau[i] = malloc(sizeof(saisie));
        Tableau[i] = saisie;
        while ( i <9 )
        {
        i = i+1;
        printf("Entrez le %d eme  ", i+1);
        scanf("%s",saisie);
        Tableau[i] = malloc(sizeof(saisie));
        Tableau[i] = saisie;
        }
    Voila je sais que c'est faux, je suis un novice en C, et je n'est pas bien compris comment on utilisait malloc.

    merci de votre aide

  2. #2
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Wahou il y a un paquet d'erreurs. Je vais en citer quelques unes pour commencer:
    • Tu veux scanner un caractère avec scanf mais tu met %s, le format pour un charactère est %c
    • Tu veux stocker ce caractère sur un pointeur de caractère qui ne pointe sur rien! il faut avoir un emplacement mémoire valable. A savoir définir saisie en tant que char (et non char*) et faire scanf("%c", &saisie);
    • L'utilisation de scanf est très dangereuse. Mieux vaut utiliser fgets
    • Tu ne libères jamais la mémoire allouée
    • Pourquoi ne pas stocker directement tes caractères dans un tableau de caractères statique?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Par défaut
    Ma variable saisie est une chaine qui peux varier ( je demande 10 saisies ) elle peut contenir de 60 à 10 caracteres.

    Et à chaque fois que je saisie ma chaine, je veux la mettre dans mon tableau de chaine.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ta variable "saisie" est un pointeur qui pointe "dans le vide"... Tu ne peux rien mettre dedans tant qu'elle ne pointe pas, soit vers une zone de mémoire allouée par malloc, soit vers une variable (un tableau en l'occurence) local.

    Ensuite scanf("%s") est extrèmement dangereux puisqu'il n'y a aucun contrôle sur la longueur de la chaine lue. Utilise plutôt fgets.

    Enfin, sizeof saisie n'est pas la longueur de la chaine. C'est la taille d'un pointeur, c'est à dire d'une adresse mémoire.

  5. #5
    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
    Et j'ajouterais que la copie de chaîne en C ne se fait pas avec = mais avec str(n)cpy.

    Le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tableau[i] = malloc(sizeof(saisie));
    Tableau[i] = saisie;
    alloue un espace mémoire dont l'adresse est mise dans tableau[i] puis cette adresse est remplacée par celle de saisie.
    D'où plusieurs problèmes : Tableau[i] ne contient pas ce que tu crois et la mémoire alloué par malloc() n'est plus atteignable donc n'est pas libérable.

  6. #6
    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 gl Voir le message
    Et j'ajouterais que la copie de chaîne en C ne se fait pas avec = mais avec str(n)cpy.
    J'éviterais de parler de strncpy() à un débutant, car c'est une source d'erreurs importantes...

    Je n'ai d'ailleurs jamais bien compris à quoi servait cette fonction...

    Préférer strncat().

  7. #7
    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 Emmanuel Delahaye Voir le message
    J'éviterais de parler de strncpy() à un débutant, car c'est une source d'erreurs importantes...

    Préférer strncat().
    Certes.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je n'ai d'ailleurs jamais bien compris à quoi servait cette fonction...
    Je vois un moins un usage pratique de la fonction strncpy() :
    La construction de "message" dans lesquels les champs de type chaînes de caractères ont une "taille fixe" avec un \0 pour marquer la fin de la partie utile de la chaîne de caractères si celle-ci est plus courte que la taille du champ mais où ce \0 n'est pas présent dans le cas contraire.
    Ce type de message se rencontre parfois dans d'anciens protocoles applicatifs ou dans des formats de fichiers en ligne de taille fixe.

    Maintenant je te l'accorde, le nom de la fonction est très mal choisi et une construction à base de memcpy() fonctionne tout aussi bien.

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Faut pas exagérer non plus, c'est pas bien dûr de rajouter un '\0' après un strncpy. D'autant qu'avec strncat() aussi il faut mettre mettre un '\0'... Mais au début. Donc question complexité c'est kif kif.

  9. #9
    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 matafan Voir le message
    Faut pas exagérer non plus, c'est pas bien dûr de rajouter un '\0' après un strncpy. D'autant qu'avec strncat() aussi il faut mettre mettre un '\0'... Mais au début. Donc question complexité c'est kif kif.
    Non. Rien à voir.

    1 - strncat() est une fonction de concaténation, donc il est logique que la chaine de destination soit initialisée avant usage. Ca fait partie des reflexes de n'importe quel programmeur...

    2 - l'initialisation se fait avec *s = 0; ce qui est nettement plus simple (et plus rapide, passons ...) que de sortir un strlen(s) après coup...

    3 - la vraie solution est d'écrire sa fonction de copie sécurisée.

    http://emmanuel-delahaye.developpez.com/clib.htm

    Module STR
    STR_safecopy()

    ou son système de chaines automatiques

    Module FSTR

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Non. Rien à voir.

    1 - strncat() est une fonction de concaténation, donc il est logique que la chaine de destination soit initialisée avant usage. Ca fait partie des reflexes de n'importe quel programmeur...
    Réflex ou non ça ne change rien, il faut le faire.

    Citation Envoyé par Emmanuel Delahaye Voir le message
    2 - l'initialisation se fait avec *s = 0; ce qui est nettement plus simple (et plus rapide, passons ...) que de sortir un strlen(s) après coup...
    Qui parle de strlen ? Il suffit de mettre un 0 dans la dernière case du buffer, dont l'indice est forcément connu puisqu'on vient de le passer à strncpy().


    Citation Envoyé par Emmanuel Delahaye Voir le message
    3 - la vraie solution est d'écrire sa fonction de copie sécurisée.
    Oui, qui peut s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strncpy(dest, src, n);
    dest[n-1] = 0;

    Sauf que strncpy va padder dest avec des 0 si src est trop court, ce qui ne sert strictement à rien.

Discussions similaires

  1. problème avec tableau de chaine de caractères
    Par soumti84 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/04/2009, 14h07
  2. Problème avec un tableau de chaines de caractères
    Par greg_h19 dans le forum Débuter
    Réponses: 1
    Dernier message: 22/12/2008, 15h31
  3. Réponses: 2
    Dernier message: 11/11/2008, 16h10
  4. Réponses: 3
    Dernier message: 20/02/2008, 22h36
  5. Problème avec comparaison de chaines de caractères
    Par nemesis00 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/01/2008, 18h56

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