IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[debutant]Chaine et fonction


Sujet :

C

  1. #1
    Halobox
    Invité(e)
    Par défaut [debutant]Chaine et fonction
    Bonjour,

    J'ai un programme ou je voudrais faire que bonjour devienne b-----r

    Tout ceci avec des fonctions,mais j'ai du mal à faire passer des chaines de caractères dans les fonctions : voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
     
    #define NB_MAX_CARACT 25
     
    char *saisir_le_mot_a_trouver(); 
    char *initialiser_la_reponse(char *mot, int longueur);
     
    int main(){ 
        char mot[] = "developpez.com"; 
        char reponse[NB_MAX_CARACT +1];
        int longueur = strlen(mot);
     
        strcpy(reponse, initialiser_la_reponse(mot,longueur)); 
        system("PAUSE"); 
        return 0; 
    } 
     
     
    char *initialiser_la_reponse(char *mot,int longueur){
         int i=0;
         char reponse[NB_MAX_CARACT +1];
         char dern_lettre[] = {mot[longueur-1],'\0'};
     
         reponse[0] = mot[0];
         strncat(reponse, "-------------------------------", longueur-2);
         reponse[longueur-1] = mot[longueur-1];
         printf("%s\n\n",reponse);
     
     
         return(reponse);
    }
    Le résultat est foireux savez vous comment faire ?


    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char *initialiser_la_reponse(char *mot,int longueur){
         int i=0;
         char reponse[NB_MAX_CARACT +1];
         char dern_lettre[] = {mot[longueur-1],'\0'};
     
         reponse[0] = mot[0];
         strncat(reponse, "-------------------------------", longueur-2);
         reponse[longueur-1] = mot[longueur-1];
         printf("%s\n\n",reponse);
     
     
         return(reponse);
    }
    Tu ne peux pas retourner "reponse" car c'est une variable locale à la fonction et son adresse devient invalide à la sortie de la fonction.
    Il faut utiliser malloc/free pour faire çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
     
    #define NB_MAX_CARACT 25
     
    char *saisir_le_mot_a_trouver();
    char *initialiser_la_reponse(char *mot, int longueur);
     
    // attention au prototype de main
    int main(void){
        char mot[] = "developpez.com";
        char reponse[NB_MAX_CARACT +1];
        char *p;
        int longueur = strlen(mot);
     
        p = initialiser_la_reponse(mot,longueur);
        if (p != NULL)
        { 
           strcpy(reponse, p);
          // on peut se poser la question de la recopie du pointeur dans 
          // le tableau reponse, puisque tu ne l'utilise pas !!!
          free(p);
       }
       else
         frpintf(stderr, "Pb alloc memoire \n");
        system("PAUSE");
        return 0;
    }
     
     
    char *initialiser_la_reponse(char *mot,int longueur){
         int i=0;
         char *reponse[NB_MAX_CARACT +1];
         char dern_lettre[] = {mot[longueur-1],'\0'};
     
        reponse = malloc(NB_MAX_CARACT +1);
        if (reponse != NULL)
        {
         reponse[0] = mot[0];
         strncat(reponse, "-------------------------------", longueur-2);
         reponse[longueur-1] = mot[longueur-1];
         printf("%s\n\n",reponse);
     
       }  
       return(reponse);
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Tu peux allouer durablement la mémoire associée à 'reponse' dans ta fonction d'init...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *initialiser_la_reponse(char *mot,int longueur){ 
         int i=0; 
         char reponse[NB_MAX_CARACT +1]; 
    ....
         return(reponse); 
    }
    reponse est un tableau local à la fonction. Il est donc détruit en sortie de la fonction qui retourne alors l'adresse d'un tableau qui n'existe plus.
    Ou tu crée reponse en allocation dynamique pour qu'il survive à la sortie de la fonction (mais il faut penser à le libérer à un moment donné)
    Ou tu passes en argument le tableau qui doit contenir la réponse et qui est défini dans la fonction appelante
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Grillés
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Trap D
    Grillés
    Et il est content en plus...

    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Trap D
    Grillés
    Je declare Trap D vainqueur
    C'est devenu une course pour repondre maintenant
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Halobox
    Invité(e)
    Par défaut
    Désolé les gars mais je ne comprensd toujours pas,


    Si on prends un exemple plus simple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include<stdlib.h>
    #include<stdio.h>
     
    #define NB_MAX_CARACT 25
    #define ERREUR_MAX 10
     
    void saisir_le_mot_a_trouver(char *);
     
    int main(){
     
     
     
        char mot[NB_MAX_CARACT +1];
     
        saisir_le_mot_a_trouver(mot);
        printf("%s",mot);
        system("PAUSE");
        return 0; 
    }
     
    void saisir_le_mot_a_trouver(char *mot){
     
         int longueur;
     
     
         printf("Veuillez entrez le mot a decouvrir :\n");
         scanf("%s",&mot);
         fflush(stdin);
    }
    Je ne comprends pas, j'envoie bien à la fonction un pointeur, donc il devrait bien faire les modifs sur la valeur pointée et ca devrait afficher le bon résultat,

    où est-ce que mon résonnement est faux ?


    Merci d'avance

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Là, tu t'emmêles les pinceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include<stdlib.h>
    #include<stdio.h>
     
    #define NB_MAX_CARACT 25
    #define ERREUR_MAX 10
     
    void saisir_le_mot_a_trouver(char *);
     
    int main(void){
     
     
     
        char mot[NB_MAX_CARACT +1];
     
        saisir_le_mot_a_trouver(mot);
        printf("%s",mot);
        system("PAUSE");
        return 0;
    }
     
    void saisir_le_mot_a_trouver(char *mot){
     
        // a quoi sert longueur qui b'est pas utilise dans la fonction ? 
        int longueur;
     
     
         printf("Veuillez entrez le mot a decouvrir :\n");
        // attention , mot est un pointeur, c'est-à-dire une varaible dont la valeur est une adresse où ranger des caractères
      // Il faut donc donner cette adresse, et non l'adresse de la variable, ce qui n'a rien à voir
         // scanf("%s",&mot); <== erreur
        scanf("%s",mot);
         fflush(stdin);
    }
    Ici, pas de problème, les "modifications" ont bien lieu, en fait tu changes le contenu de la mémoire à l'adresse indiquée, tu ne changes pas la valeur de l'adresse, celà n'a rien à voir avec ce qui est évoqué au début de ce topic.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Halobox
    Invité(e)
    Par défaut
    Oui je sais bien que ce n'est pas vraiment pareil mais j'avais besoin de revoir les bases, merci de ton aide.

Discussions similaires

  1. [Debutant] Nom de fonction identique
    Par gentyjp dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/09/2006, 16h33
  2. [debutant] appel de fonctions
    Par Trolls dans le forum Langage
    Réponses: 7
    Dernier message: 06/06/2006, 18h21
  3. [Débutant][Maths] La fonction sqrt
    Par ETI-trian dans le forum Général Java
    Réponses: 3
    Dernier message: 05/01/2006, 08h02
  4. [debutant]appeller une fonction d'une classe fille et mere ?
    Par Battosaiii dans le forum Débuter
    Réponses: 1
    Dernier message: 12/11/2005, 12h56
  5. Réponses: 9
    Dernier message: 22/07/2005, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo