Resultat d'une fct est un paramétre d'entée de la mm fct

Résolu/Fermé
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 - 4 juin 2013 à 12:20
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 juin 2013 à 21:43
Bonjour,
Je voudrais avoir votre aide, sur un truc que j'arrive pas moi aussi à saisir, si çà existe déjà ou non.

* J'ai une fonction Copier qui retourn un Char* chaine :
char* COPIER(char* bloc, int pas1, int pas2);
- Je copie tous les caractères entre un pas1 et pas2 ( pas1 et pas2 désignons le numero des espaces: bloc = AAA_pas1_BBB CCC_pas2_DDD EEE [ici je vais copier BBB CCC]).
- bloc est une chaine de caractères, les mots de dans sont séparés par des espaces.
* Dans le main : pour récuperer le résultat de la fonction copier,
je fais, exemple : char* chaine = char* COPIER(char* bloc, int pas1, int pas2);

Ce que je veux , est-ce qu'il y a u une possibilté pour que le retour de la fonction copier soit parmi les paramétres d'entrées de la fonction? je m'explique
au lieu de faire :
++ char* chaine = char* COPIER(char* bloc, int pas1, int pas2);
j'aurais un truc comme :
++ COPIER(char* bloc, int pas1, int pas2, char* chaine);
c-à-d le résultat va être directement stocké dans chaine,
et sa veut dire dans le main , je directement écrire :
COPIER(char* bloc, int pas1, int pas2, char* chaine); ?

J'en ai besoin pour mon travail.Merci
A voir également:

3 réponses

neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
4 juin 2013 à 12:21
J'ai pensé à changer la fct à int Copier(char* bloc, int pas1, int pas2, char* chaine), mais je reçois toujours une segmentation fault.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
4 juin 2013 à 21:19
Bonjour,

Oui c'est tout à fait possible.
Le segfault est probablement obtenu parce que tu n'as pas alloué ta chaîne (malloc par exemple).
Ce qui donnerait :
int main(void) {
   /*définition de bloc, pas1 et pas2*/
   resultat=malloc(strlen(bloc)+1);
   COPIER(bloc, pas1,pas2, resultat);
   printf("après : %s\n", resultat);
   return 0;
}
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
4 juin 2013 à 21:24
Bonjour,
J'ai résolu mon pb, voici un exemple démonstratif :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void intChange(int* a)
{
*a = 14;
}

void strChange(char** str)
{
free(*str);
*str = malloc(6 * sizeof (char));
strcpy(*str, "hello");
}

int main()
{
int nb = 5;
char* str = NULL;

printf("Avant: %i\n", nb);
intChange(&nb);
printf("Après: %i\n", nb);

str = malloc(7 * sizeof (char));
strcpy(str, "coucou");
printf("Avant: %s\n", str);
strChange(&str);
printf("Après: %s\n", str);
free(str);

return 0;
}


Effectivement, le pb était l'allocation de la mémoire pour la chaine de retour.
Merci pour votre aide.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
4 juin 2013 à 21:43
Pour info, tu n'as pas besoin de refaire une allocation dans ta fonction strChange() du moment que la mémoire pointée par str est assez grande.
Un simple strcpy() suffira (et donc pas besoin non plus de passer par un double pointeur).
0