[C]Récupérer un char* de taille variable.
Résolu
Nieli
Messages postés
85
Statut
Membre
-
Nieli Messages postés 85 Statut Membre -
Nieli Messages postés 85 Statut Membre -
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
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
A voir également:
- [C]Récupérer un char* de taille variable.
- Comment réduire la taille d'un fichier - Guide
- Comment recuperer un message supprimé sur whatsapp - Guide
- Comment récupérer un compte facebook piraté - Guide
- Reduire taille image - Guide
- Récupérer mon compte facebook désactivé - Guide
6 réponses
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 :
Cdlt
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
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? :/
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? :/
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
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
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?
}
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?
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Dans ce cas, fais plutôt :
Si tu as des questions, sur le code, n'hésite pas.
Cdlt
#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