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);
    }

  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...

  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

  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

  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...


  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

  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.

  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