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 :

c/c++: ajouter des \0


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par défaut c/c++: ajouter des \0
    Bonjour,
    Je cherche un moyen d'ajouter des '\0' à la fin d'une chaîne de caractères:
    j'ai un bibliothèque qui ne fonctionne pas correctement si on ne lui donne pas le bon nombre de caractère \0 inclu:
    à la main si j'ai
    et qu'il faut 6 caractères je dois faire à la main:
    J'en ajoute un car il y a déjà un \0 inclu dans une chaîne.
    Comment faire une fonction qui ajoute les \0 sachant que je me trouve bloqué avec strcat qui n'a pas l'air de prendre en compte les caractères après le premier \0
    je sèche :-(

    Merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Hello

    Je ne sais pas trop ce que tu magouilles mais tu devrais plutôt utiliser std::string avec la méthode c_str() et size(). En général, la longueur d'une chaîne est le nombre de caractères sans le caractère terminal \0 (c'est ce que renvoie size()), mais si la bibliothèque que tu utilises a besoin de le compter, il suffit d'ajouter 1 à la taille, pas besoin de modifier la chaîne !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Hello

    Je ne sais pas trop ce que tu magouilles mais tu devrais plutôt utiliser std::string avec la méthode c_str() et size(). En général, la longueur d'une chaîne est le nombre de caractères sans le caractère terminal \0 (c'est ce que renvoie size()), mais si la bibliothèque que tu utilises a besoin de le compter, il suffit d'ajouter 1 à la taille, pas besoin de modifier la chaîne !
    Merci pour ta réponse, en effet je galère, pour le détail voici le code que j'utilise:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
         #include <iostream>
         #include <netcdfcpp.h>
         #include <vector>
     
         using namespace std;
     
         static const int NX = 12;
         static const int NY = 6;
         static const int NC_ERR = 2;
     
    int main(void)
         {
            int dataOut[NX][NY];
     
            for(int i = 0; i < NX; i++)
               for(int j = 0; j < NY; j++)
                   dataOut[i][j] = i * NY + j;
     
            NcFile dataFile("chaine.nc", NcFile::Replace);
     
            if (!dataFile.is_valid())
            {
               cout << "Couldn't open file!\n";
               return NC_ERR;
            }
     
            NcDim* xDim = dataFile.add_dim("x", NX);
            NcDim* yDim = dataFile.add_dim("y", NY);
     
            NcVar *monChar1 = dataFile.add_var("monChar1", ncChar, xDim, yDim);
     
            vector<char*> dataOut1Vec;
            dataOut1Vec.push_back("az\0\0\0");
            dataOut1Vec.push_back("aa\0\0\0");
            dataOut1Vec.push_back("aaa\0\0");
            dataOut1Vec.push_back("aaaa\0");
            dataOut1Vec.push_back("aaa\0\0");
            dataOut1Vec.push_back("aa\0\0\0");
            dataOut1Vec.push_back("a\0\0\0\0");
            dataOut1Vec.push_back("1aaaa");
            dataOut1Vec.push_back("12aaaa");
            dataOut1Vec.push_back("123aaa");
            dataOut1Vec.push_back("12aaaa");
            dataOut1Vec.push_back("1aaaa");
     
            for(int i=0 ; i<12 ;i++)
                monChar1->put_rec(xDim, &(dataOut1Vec[i][0]), i);
     
            return 0;
         }
    Ce code permet de générer un fichier netCDF et si je ne met pas les \0 pour arriver au bon nombre de caractères ça m'affiche des horreurs à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      "az\000aa",
      "aa\000aaa",
      "aaa\000aa",
      "aaaa\000a",
      "aaa\000aa",
      "aa\000aaa",
      "a\0001aaa",
      "1aaaa",
      "12aaaa",
      "123aaa",
      "12aaaa",
      "1aaaa" ;
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      "az",
      "aa",
      "aaa",
      "aaaa",
      "aaa",
      "aa",
      "a",
      "1aaaa",
      "12aaaa",
      "123aaa",
      "12aaaa",
      "1aaaa" ;
    Merci

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    1. Suis le conseil de jblecanard et utilise des string
    2. Tu peux forcer la taille des chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // avec string
    string str = "toto";
    str.resize(6);
     
    // avec char*
    char tab[6] = "toto";

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Salut

    1. Suis le conseil de jblecanard et utilise des string
    2. Tu peux forcer la taille des chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // avec string
    string str = "toto";
    str.resize(6);
     
    // avec char*
    char tab[6] = "toto";
    Merci ! ce post m'a débloqué!

    alors voici mon code, serte il est bourrin mais ça marche sur ce principe:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
         #include <iostream>
         #include <netcdfcpp.h>
         #include <vector>
     
         using namespace std;
     
         static const int NX = 12;
         static const int NY = 6;
         static const int NC_ERR = 2;
     
    int main(void)
         {
            int dataOut[NX][NY];
     
            for(int i = 0; i < NX; i++)
               for(int j = 0; j < NY; j++)
                   dataOut[i][j] = i * NY + j;
     
            NcFile dataFile("chaine.nc", NcFile::Replace);
     
            if (!dataFile.is_valid())
            {
               cout << "Couldn't open file!\n";
               return NC_ERR;
            }
     
            NcDim* xDim = dataFile.add_dim("x", NX);
            NcDim* yDim = dataFile.add_dim("y", NY);
     
            NcVar *monChar1 = dataFile.add_var("monChar1", ncChar, xDim, yDim);
     
            vector<string> dataOut1Vec;
            string str = "az";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aaa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aaaa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aaa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "a";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "1aaaa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            str = "aa";
            str.resize(6);
            dataOut1Vec.push_back(str);
            for(int i=0 ; i<12 ;i++)
                monChar1->put_rec(xDim, &(dataOut1Vec[i][0]), i);
     
            return 0;
         }

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Par défaut
    Sinon à y être (bourrin ), tu peux aussi utiliser des fonctions très bas niveau du C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char tab[] = "toto";
    memset(tab+4, '\0', 2); //Remplis 2 octets de la zone mémoire pointé par tab+4 (soit à partir de tab[4]) avec \0
    Ceci dit, ce n'est peut-être pas très judicieux de procéder ainsi !

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par CladStrif Voir le message
    Sinon à y être (bourrin ), tu peux aussi utiliser des fonctions très bas niveau du C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char tab[] = "toto";
    memset(tab+4, '\0', 2); //Remplis 2 octets de la zone mémoire pointé par tab+4 (soit à partir de tab[4]) avec \0
    Ceci dit, ce n'est peut-être pas très judicieux de procéder ainsi !
    Pas judicieux et très dangeureux... imagine si tu as une autre chaîne qui commence à l'adresse mémoire tab+5 (ou n'importe quoi d'autre), que crois tu qu'il va se passer ?

Discussions similaires

  1. Ajouter des chemins dans la variable PATH
    Par Righetto Dominique dans le forum Linux
    Réponses: 7
    Dernier message: 21/03/2004, 17h38
  2. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 01h18
  3. Ajouter des contrôles dans la palette des contrôles.
    Par WOLO Laurent dans le forum MFC
    Réponses: 4
    Dernier message: 22/01/2004, 08h27
  4. Réponses: 5
    Dernier message: 13/11/2003, 16h57
  5. Réponses: 1
    Dernier message: 02/01/2003, 12h45

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