Tout d'abord, sache que gérer des chaines de caractères en C n'est pas une mince affaire, et qu'il vaut mieux avoir lu quelques docs dessus avant de se lancer (j'ai pas de liens en tête sur le moment).
Ensuite, pour ton problème :
En ce qui concerne le redimensionnement d'une chaine, cela n'est (généralement) possible que sur les chaine que tu a alloué toi-même (ou alors si tu est vraiment sur que la chaine qu'on te renvoie a été allouée avec malloc) sinon un realloc ne marchera pas. Et de toutes facons, quand une fonction te renvoie un pointeur sur un truc du système ou de l'environnement, il ne vaut mieux pas y toucher et plutot faire une copie. Ca pourra aussi t'etre utile si t'es ammené à la modifier après.
Pour le sprintf(), deux problèmes :
- il n'alloue pas tout seul la mémoire, donc c'est à toi de le faire (malloc)
- tu as mal utilisé sprintf : le premier argument est le buffer dans lequel tu vas écrire, le deuxième est le format, et les suivants les arguments du format. Donc ca devrait etre quelques chose comme : sprintf(ptr_env, "'%s'", ptr_env); bien que ce soit une très mauvaise idée d'utiliser le même pointeur; comme ça je crois que ca fout ta chaine en l'air...
Une remarque également sur ton essai avec buff[100] (en plus du problème de l'ordre des arguments) : ceci déclare un buffer statique (contrairement au malloc(), dynamique) qui pointera donc toujours vers la meme zone mémoire. Donc si tu fais deux appels à ta fonction, le deuxième renverra le meme pointeur, certes avec la bonne chaine, mais à ce moment là la première aura été remplacée par la deuxième ... (idem pour le "NULL" : tu n'as pas intéret à le modifier après)
Bon, tout ca pour finir avec ce bout de code la (non testé):
Tout ca sans oublier de free() le résultat une fois fini.
Remarque ici que strdup() renvoie une chaine allouée par malloc(), comme décrit dans la doc (man strdup), tu pourra donc le realloc si tu veux (tu va me dire qu'après ta fonction ca sert plus a rien, ok ...).
Autre détail : le malloc() qui prend la taille de la chaine + 2 pour les deux quotes et + 1 pour le "null terminator", soit le terminateur de chaine en C (qui est 0).
De plus, il est généralement mieux d'utiliser snprintf() que sprintf() afin d'éviter de déborder du buffer ...
Bref, tout ca pour dire que la gestion des chaines en C c'est galère, et je ne sais pas pourquoi tu veux faire ca mais je te conseillerai d'utiliser la glib qui contient pas mal de fonctions pour gérer tout ca plus facilement. Ou alors de changer de langage ...
Je ne veux pas te décourager, moi j'ai commencé par le C et je trouve ca assez ... "instructif"
# Le C et la gestion des chaines de caractères ...
Posté par benoar . En réponse au message Pointeur et chaines de caractères.... Évalué à 3.
Ensuite, pour ton problème :
En ce qui concerne le redimensionnement d'une chaine, cela n'est (généralement) possible que sur les chaine que tu a alloué toi-même (ou alors si tu est vraiment sur que la chaine qu'on te renvoie a été allouée avec malloc) sinon un realloc ne marchera pas. Et de toutes facons, quand une fonction te renvoie un pointeur sur un truc du système ou de l'environnement, il ne vaut mieux pas y toucher et plutot faire une copie. Ca pourra aussi t'etre utile si t'es ammené à la modifier après.
Pour le sprintf(), deux problèmes :
- il n'alloue pas tout seul la mémoire, donc c'est à toi de le faire (malloc)
- tu as mal utilisé sprintf : le premier argument est le buffer dans lequel tu vas écrire, le deuxième est le format, et les suivants les arguments du format. Donc ca devrait etre quelques chose comme : sprintf(ptr_env, "'%s'", ptr_env); bien que ce soit une très mauvaise idée d'utiliser le même pointeur; comme ça je crois que ca fout ta chaine en l'air...
Une remarque également sur ton essai avec buff[100] (en plus du problème de l'ordre des arguments) : ceci déclare un buffer statique (contrairement au malloc(), dynamique) qui pointera donc toujours vers la meme zone mémoire. Donc si tu fais deux appels à ta fonction, le deuxième renverra le meme pointeur, certes avec la bonne chaine, mais à ce moment là la première aura été remplacée par la deuxième ... (idem pour le "NULL" : tu n'as pas intéret à le modifier après)
Bon, tout ca pour finir avec ce bout de code la (non testé):
char *get_env(char * ptr_string){
char *ptr_env, *quoted_env;
ptr_env = getenv(ptr_string);
if (ptr_env == NULL) {
quoted_env = strdup("NULL");
else{
quoted_env=malloc(strlen(ptr_env)+3);
sprintf(quoted_env, "'%s'", ptr_env);
}
return(quoted_env);
}
Tout ca sans oublier de free() le résultat une fois fini.
Remarque ici que strdup() renvoie une chaine allouée par malloc(), comme décrit dans la doc (man strdup), tu pourra donc le realloc si tu veux (tu va me dire qu'après ta fonction ca sert plus a rien, ok ...).
Autre détail : le malloc() qui prend la taille de la chaine + 2 pour les deux quotes et + 1 pour le "null terminator", soit le terminateur de chaine en C (qui est 0).
De plus, il est généralement mieux d'utiliser snprintf() que sprintf() afin d'éviter de déborder du buffer ...
Bref, tout ca pour dire que la gestion des chaines en C c'est galère, et je ne sais pas pourquoi tu veux faire ca mais je te conseillerai d'utiliser la glib qui contient pas mal de fonctions pour gérer tout ca plus facilement. Ou alors de changer de langage ...
Je ne veux pas te décourager, moi j'ai commencé par le C et je trouve ca assez ... "instructif"