Convertir string en char*

[Résolu]
Signaler
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
-
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
-
Bonjour,
je n'arrive pas à convertir une string en char*, je sais que ca parait tout bete, mais je bloque, si quelqu'un pouvait m'aider, ce serai super.

Voici mon code

void receive ( size_t sz, char* buf )
{
    size_t nb=0,i;
    string tmp, err;

    for( i=0; i < sz ; )
    {
        char* recpt=new char[65535];

        nb=recv(id_socket,&recpt[0],(int)((sz-i-1)%65535+1),0);

        if(nb==0)
            break;

        for(int j=0;j<nb;j++)
            tmp+=recpt[j];

        i+=nb;
        cout << "nb : " << nb << endl;

        delete(recpt);
    }

    string::const_iterator it=tmp.begin();
    int nbtmp=0;
    while(it!=tmp.end())
    {
        buf[nbtmp++]=*it++;
    }
    /* ou
    strncpy(&buf[0],tmp.c_str(),tmp.size()); marche pas non plus
    */

    cout << "Taille de la string : " << tmp.size() << " celle de la chaine : " << strlen(buf)-1  << endl;

}

Voila, dans ma string, j'ai toutes les infos qui m'interesse, mais la ou ca plante c'est pour le mettre dans un char*.

Et une trace à l'execution :
#> prog.exe
#> ...
#> Taille de la string : 113788 celle de la chaine : 3
#> ...

La je bloque vraiment, si quelqu'un sait d'ou ca peut venir.
Merci

TuRn3r

6 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
C'est a toi de la retenir quelque part, avec les différentes valeur nb que tu reçois
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
J'ai résolu mon problème, en fait, je passe par des pointeurs

void receive ( size_t sz, char* buf, size_t* buf_sz )
{
size_t nb=0,i;
string tmp, err;

char* fg=new char[SIZE_MAX];

for( i=0; i < sz ; )
{
char* recpt=new char[65535];

nb=recv(id_socket,&recpt[0],(int)((sz-i-1)%65535+1),0);

if(nb==0)
break;

for(int j=0;j<nb;j++)
tmp+=recpt[j];

i+=nb;

delete(recpt);
}

if(tmp.size() >= SIZE_MAX)
{
err+="Chaine recu trop longue, augmenter TAILLE_MAX";
throw(err);
}

*buf_sz=tmp.size();

string::const_iterator it=tmp.begin();
int nbtmp=0;
while(it!=tmp.end())
{
buf[nbtmp++]=*it++;
}
}

TuRn3r
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Le problème c'est qu'il y a des caractères nuls (le quatrième au moins). Du coup, strlen de retourne 3. Tu n'a qu'a essayer tmp.length(), tu aura aussi 3 normalement
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Merci, mais non, ca me rend bien 113788, de toute facon tmp.length() et tmp.size() c'est la meme chose.
Par contre qu'il y ai un caractere nul, c'est fort probable.
Mais, comment je fait pour connaitre la taille de ma chaine buf alors ???

TuRn3r
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Par contre et c'est peut-etre ca que tu voulai dire, mais un strlen(buf.c_str()) me rend bien 4 (pas 3 à cause du -1 que je faisait 'strlen(buf)-1').

En fait, je pense que ca copie bien tout comme il faut, mais du coup, comment je fait pour connaitre la taille de ma chaine buf ?

Merci

TuRn3r
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
A la place de strlen(buf.c_str()) il faut lire strlen(tmp.c_str()) bien sur.
Y'a pas moyen de retrouver la taille de ma chaine ?

TuRn3r