[C]Récupérer un char* de taille variable.

Résolu/Fermé
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 - 4 déc. 2008 à 17:46
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 - 4 déc. 2008 à 19:07
Bonsoir,
C'est un problème qui a déjà du être abordé et qui doit vous sembler simple mais je n'arrive pas à trouver comment on fait.

En fait je voudrais savoir comment récupérer dans une variable de type char *, le résultat d'une fonction système.

Par exemple :

char *rep;
getcwd(rep,sizeof(rep)); //retourne le répertoire courrant
Hors ma variable rep n'a pas été instancées et sa taille est donc 0, donc ca récupère 0 caractères.
Le problème c'est que je ne peux pas vraiment fixer la taille de rep, sinon le résultat du getcwd pourra dépasser et donc erreur de segmentation.

Voilà, si vous pouviez m'aidez ^^..

Merci d'avance

Nieli

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 déc. 2008 à 18:01
Salut,
Tu utilises un pointeur non alloué. Qui plus est, lorsque tu utilises sizeof sur un pointeur, ça ne retournera pas la taille du nombre de char sur lequel il pointe, mais ça te retournera la taille d'un char* (souvent 4). De plus, il vaut mieux tester le retour de getcwd car elle peut retourner NULL si le tableau n'est pas assez grand.
Voici un exemple d'implémentation :
int main(void){
    char p[50];
    if(getcwd(p,sizeof p)==NULL) exit(-1);
    puts(p);
    return 0;
}

Cdlt
0
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 6
4 déc. 2008 à 18:07
Je sais bien :/

Mais ce que tu fais c'est ré-écrire mon problème.
Si getcwd renvoie une char* de taille 51 -> erreur de segmentation, c'est ca mon problème

Tu es sur que getcwd renverra NULL si la taille est plus grande? :/
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 déc. 2008 à 18:13
T'as pas dû bien lire ce que j'ai dit ^^.
De plus, il vaut mieux tester le retour de getcwd car elle peut retourner NULL si le tableau n'est pas assez grand.
Donc, pas d'erreur de segfault, puisque tu spécifies la taille en paramètres. Au pire, getcwd te renverra NULL.
Cdlt
0
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 6
4 déc. 2008 à 18:19
Oui, j'ai édité mon message par la suite, donc pas moyen de faire varier la taille du "receptable" en fonction de ce que renvoie getcwd ?
Quelque chose du genre


int taille= 50;
char rep[50];
while (getcwd(rep,sizeof(rep)==NULL)
{
taille++;
char rep[taille]; //oui la ca compile pas mais un truc du genre?
}
0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 déc. 2008 à 18:35
Dans ce cas, fais plutôt :
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main(void){
    size_t len=2;
    char *p=malloc(len);
    if(p==NULL) exit(-1);
    while(getcwd(p,len)==NULL && errno==ERANGE)
        if(realloc(p,++len)==NULL) exit(-1);

    puts(p);
    free(p);p=NULL;
    return 0;
}

Si tu as des questions, sur le code, n'hésite pas.
Cdlt
0
Nieli Messages postés 83 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 23 avril 2009 6
4 déc. 2008 à 19:07
Parfait, je pensais bien que c'était une hsitoire de malloc/calloc/free.

Merci beaucoup ^^.
0