Convertir string en char*

Résolu
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 - 3 mai 2006 à 15:44
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 - 4 mai 2006 à 09:54
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 mai 2006 à 16:08
C'est a toi de la retenir quelque part, avec les différentes valeur nb que tu reçois
3
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
4 mai 2006 à 09:54
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 mai 2006 à 15:55
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
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
3 mai 2006 à 16:05
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
3 mai 2006 à 16:08
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
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
3 mai 2006 à 16:10
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
0
Rejoignez-nous