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 :

Comment concaténer des variables char


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut Comment concaténer des variables char
    Bonjour.
    Je me prends le chou depuis un très très bon moment.

    J'ai besoin de concaténer des variable char en une seul.

    Un gros je déclare des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char coords[116];
    char lat[15];
    char lon[15];
    char alt[15];
    char time[15];
    char vel[15];
    J'ai une fonction qui va donner des valeur au variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gps.getPar(lon,lat,alt,time,vel);
    Ces variables prennent des valeurs comme
    34.5678
    234.6789

    Elles ne peuvent pas avoir une longueur supérieure à 15, mais peuvent en avoir 10

    J'aimerais que la variable coords prenne les valeurs des autres variables et y ajouter des String "lon=", "&lat=", "&alt=","&vel=","&time=".

    J'ai donc essayé ceci

    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
     
      strcpy(coords,"long=");
      strncat(coords,lon,COORDSSIZ); //21
     
      strcat(coords,"&lat=");        //25
      strncat(coords,lat,COORDSSIZ);//40
     
      strcat(coords,"&alti=");        //46
     
      strncat(coords,alt,COORDSSIZ);  //61
     
      strcat(coords,"&time=");        //66
      strncat(coords,time,20);      //86
     
     
      strcat(coords,"&vel=");        //91
      strncat(coords,vel,COORDSSIZ);  //116
    Au final coords doit afficher ceci
    long=608.476993&lat=4613.165159&alt=345.678&vel=0.00000&time=20130714190621.000


    Le problème, c'est au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncat(coords,alt,COORDSSIZ);  //61
    Le programme plante.
    Si comment ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      strncat(coords,alt,COORDSSIZ);  //61
     
      strcat(coords,"&time=");        //66
      strncat(coords,time,20);      //86
     
     
      strcat(coords,"&vel=");        //91
      strncat(coords,vel,COORDSSIZ);  //116
    Le programme ne plante pas.

    En résumé, comment puis concatener des char?

    Si je peux concaténer les lat, lon, alt, vel, time en y ajoutant des virgules à la place des "&xxx=", je serai heuruex...

    PS; je crois que mon problème est lié au buffer de coords et de la longueur des caractères dans les autres variables, et peut-être du terminateur des variables. Mais là je suis largué.


    milles merci pour votre précieuse aide

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Bonsoir, dans ce cas précis snprintf() est plus appropriée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf(coords, sizeof coords,"long=%s,lat=%s,alt=%s,vel=%s,time=%s",lon,lat,alt,vel,time);


    Citation Envoyé par pierrot10
    Un gros je declare des variable
    char coords[116];
    char lat[15];
    char lon[15];
    char alt[15];
    char time[15];
    char vel[15];

    <...>

    Au final coords doit afficher ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long=608.476993&lat=4613.165159&alt=345.678&vel=0.00000&time=20130714190621.000

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Merci pour ta reponse, mais ca crash toujours.
    Mais ta reponse est intéressante.

    Comment puis-je etre sure que 116 de

    char coords[116];

    est juste?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    C'est intéressant et ca semble avancé

    J'ai mis cette variable ainsi
    char coords[]="";

    Mon code ne crash plus et fonction sauf que coords n'affiche rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      snprintf(coords, sizeof coords,"lon=%s,lat=%s,alti=%s,vel=%s,time=%s",lon,lat,alt,vel,time);
     
      #ifdef DEBUG
        Serial.print(F("Coords : "));                               
        Serial.println(coords); // Ca affiche rien
      #endif

  5. #5
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    Tu risques la segfault si tu ne donnes pas de taille. Ça risque d'écrire n'importe où.


  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Montre-nous un code compilable reproduisant l'erreur...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 165
    Par défaut
    Hello

    @moins1

    J'ai changé et mis une taille ainsi
    Mais ça ne change rien. Ça crache

    Y a t il un moyen de calculer la taille pour définir le numéro x de char coords[x]; ?

    @ordfix
    Je n'ai pas de message d'erreur, voici le code qui coince
    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
    25
    26
    27
    28
    29
     
    void getGPSCoords(){
      #ifdef DEBUG
        stat=gps.getStat();
        if(stat==1){
          Serial.println("NOT FIXED");
        }else if(stat==0){
          Serial.println("GPS OFF");
        }else if(stat==2){
          Serial.println("2D FIXED");
        }else if(stat==3){
          Serial.println("3D FIXED");
        }
        delay(5000);
      #endif    
     
      //Get data from GPS
     
        gps.getPar(lon,lat,alt,time,vel);
     
     
      snprintf(coords, sizeof coords,"lon=%s,lat=%s,alti=%s,vel=%s,time=%s",lon,lat,alt,vel,time);
     
      #ifdef DEBUG
        Serial.print(F("Coords : "));                               
        Serial.println(coords);
      #endif
     
    }
    char coords[x]; est défini plus haut dans mon code

    J'ai testé aussi cette solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      String fixe = "long=" + String(lon) + "&lat=" + String(lat) + "&alti=" + String(alt) + "&vel=" + String(vel) + "&time=" + String(time);
     
     
     Serial.println(fixe);
     Serial.println(fixe.length());
      //fix.toCharArray(coords, 109);
    et je n'arrive pas comprendre pourquoi fixe est vide, donc fixe.length() retourne 0.

    Je devrais avoir un truc du genre pour fixe
    "long=34.5678&lat=345.67890&alti=45.787664&vel=456.777777&time=201307134565.00000"
    À savoir que lon, lat, alt, vel et time sont des char.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Tu peux utiliser asprintf(), qui va allouer la chaine dans laquelle le résultat est placé.

    Et puisque c'est un forum C++, tu peux aussi utiliser les stream C++, y compris std::stringstream.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Tu peux utiliser asprintf(), qui va allouer la chaine dans laquelle le résultat est placé.
    Attention, d'après le man asprintf n'est pas standard.

    Citation Envoyé par Emmanuel Deloget Voir le message
    Et puisque c'est un forum C++, tu peux aussi utiliser les stream C++, y compris std::stringstream.
    En lisant le sujet je croyais que j'étais dans le forum C

    A la place des tableaux de char, je pense qu'il vaudrait mieux utiliser std::string pour les chaînes de caractères aussi.

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/07/2008, 14h58
  2. Réponses: 4
    Dernier message: 26/05/2006, 17h17
  3. [VB] Comment creer des variables d'environnement
    Par keveen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 16/03/2006, 11h13
  4. Réponses: 7
    Dernier message: 23/01/2006, 11h53
  5. Réponses: 1
    Dernier message: 30/12/2005, 10h57

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