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 :

Pb d'utilisation de strcat


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut Pb d'utilisation de strcat
    Bonjour,
    J'ai un algorithme, si je le simplifie, ça donne :

    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
     
    //init
    char*	prefixe;
    char code_tp[5 + 1];
    char code_tb[5 + 1];
     
    EXEC SQL 
    			SELECT h_code_tp, h_code_tb
    			INTO	:code_tp, :code_tb
    			FROM matable
    			WHERE ...
    		;
     
    if(strcmp(code_tp,"") != 0) {
    			prefixe= "TP ";
    			strcat(prefixe,code_tp);       *
    }
    else if(strcmp(code_tb,"") != 0) {
    			prefixe= "TB ";
    			strcat(prefixe,code_tb);
    }
    Le code, en l'état actuel, comporte manifestement un problème, qui se situe sur la ligne du strcat (*). J'ai inséré des traces tout autour avant et après, et la dernière trace qui sort est celle juste avant le strcat. Après, plus rien, le programme plante.
    Je ne comprends pas quel est le pb, ni pourquoi il survient là.
    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Seuls 4 caractères sont alloués à prefixe.
    En faisant strcat, le programme essaye d'écrire dans des zones mémoires non allouées.

    Il faudrait faire quelque-chose come ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    prefixe = new char[9]; // Edit pour en dessous: désolé pour l'erreur
    (...)
    strcpy(prefixe, "TP ");
    strcat(prefixe, code_tp);
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    prefixe = new char[9];
    (...)
    sprintf(prefixe,"TP %s",code_tp);
    Dernière modification par Invité ; 24/02/2011 à 12h03.

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    Ta variable prefixe est définie en tant que pointeur sur une chaine de caractères. Si tu veux lui attribuer une chaine il faut faire un malloc du nombre d'octets dont tu as besoins + 1 pour le \0 final. Sans oublier bien-sur de libérer l'espace mémoire allouée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char *prefixe = NULL ;
     
    if(strcmp(code_tp,"")!= 0) {
        prefixe = (char*)malloc(3+strlen(code_tp)+1) ;  // "TP " + "nombre d'octets de code_tp" + '\0'
        if(prefixe!=NULL) {
            sprintf(prefixe, "TP %s", code_tp) ;
            // Utilisation de prefixe
            { ... }
            free(prefixe) ;     // Libération de la mémoire précédemment allouée.
            prefixe = NULL ;    // RAZ de prefixe
        }
    }
    [edit] : J'avais oublié de mettre à NULL prefixe après la libération de la mémoire.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Il faudrait faire quelque-chose come ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    prefixe = new char[9];
    (...)
    strcpy(prefixe, "TP ");
    strcat(prefixe, code_tp);
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    prefixe = new char[9];
    (...)
    sprintf(prefixe,"TP %s",code_tp);
    Pas en C !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut
    Merci pour vos réponses, j'ai finalement utilisé la fonction sprintf, qui m'a paru plus claire à utiliser que strcat.
    Et ça marche.
    Effectivement, le = new char[10], ce n'est pas du C !
    Je clos le topic.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de strcat()
    Par furiousdraz dans le forum Débuter
    Réponses: 3
    Dernier message: 14/07/2008, 14h10
  2. Réponses: 2
    Dernier message: 24/12/2006, 17h33
  3. utiliser strcat apres malloc
    Par remi77 dans le forum C
    Réponses: 13
    Dernier message: 26/10/2006, 10h21
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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