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 :

fonction dans le langage C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut fonction dans le langage C
    bonjour cher dévelloppeurs!!!je suis un débutant dans le langage C.
    s'il vous plait je viens de découvrir le site et je sollicite votre aide pour mettre sur pied une fonction qui renvoie une chaine2 de longueur n contenue dans une chaine1.le prototype proposé est le suivant:MID(chaine1[],chaine2[],n).

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fabibass Voir le message
    et je sollicite votre aide pour mettre sur pied une fonction qui renvoie une chaine2 de longueur n contenue dans une chaine1.le prototype proposé est le suivant:MID(chaine1[],chaine2[],n).
    Bonjour

    Je ne comprends pas trop les paramètres de cette fonction "MID" (middle?) et ta façon de l'utiliser (avant de la coder). Si par exemple tu lui passes "bonjour" en chaine n° 1, que comptes-tu lui passer en chaine n° 2 et en valeur "n" ?
    En fait, tu dis "je veux qu'elle renvoie la chaine2" alors que tu lui passes justement cette chaine2. Bref si j'appelle (éventuellement) MID("bonjour", "our", 3) et qu'elle me renvoie "our" je ne vois pas à quoi ça m'a servi de l'appeler...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    A moins qu'il ne s'agisse d'écrire dans la seconde un morceau de la première.
    C'est envisageable, mais il manque plusieurs informations en arguments:

    Pour copier un morceau, il faut savoir sa longueur et sa position.
    Il faut aussi savoir où le copier: position et longueur acceptable.
    Et enfin, il serait éventuellement intéressant de limiter la zone lisible.

    La fonction pourrait avoir pour signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /*
    copie un segment de chaine dans une autre
    s'attend à ce que chaine soit au moins longue de début+longueur+1 (pour le \0) caratères 
    s'attend aussi à ce que chaine_cible puisse accueil longueur+1 caratères
    */
    morceau(chaine, chaine_cible, début, longueur)
    .

    on peut aussi imaginer quelque chose plus ordonné, comme morceau(chaine, début, longueur, chaine_cible), ou une variante début+fin, telle que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /*
    copie le segment de chaine compris entre début inclus et fin exclus, dans chaine_cible.
    s'attend à ce que chaine soit au moins longue de fin (pour le \0) caratères 
    s'attend aussi à ce que chaine_cible puisse accueil (fin-début)+1 caratères
    */
    morceau(chaine, début, fin, chaine_cible)
    .

    Par ailleurs, comme tu demandes de l'aide, c'est que tu n'as pas compris comment faire.
    Dis nous ce que tu penses faire, et montre nous ta tentative, et nous t'aiderons à comprendre.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut modification
    salut les développeurs.merci pour les réactions.j'ai commis une erreur. en fait la fonction a pour prototype MID(chaine[],n1,n2) et doit me renvoyer un extrait de chaine[],commençant par le caractère numéro n1 et de longueur n2.voila!!!!! MERCI

  5. #5
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Bonjour fabibass et bonjour à tous,

    Dans le Basic d'antant, "MID" permettait de renvoyer une chaîne à l'intérieur d'une autre chaîne en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat$ = MID(chaine$, 10, 5)
    d'une façon qui ressemble à ce que Visual Basic fait aujourd'hui : http://msdn.microsoft.com/fr-fr/libr...=vs.90%29.aspx

    Je suppose que ce que fabibass veux faire est en fait de répliquer le fonctionnement de cette instruction.

    S'agissant du cas où le nombre de caractères demandés dépasse le nombre de caractères disponibles à partir de la position donnée, Basic ne s’embarrasse pas et retourne le nombre de caractères disponibles à partir de la position.

    fabibass pourrait décider de faire la même chose. C'est un choix d'implémentation qui doit être fait, en tout cas (et documenté, en autres informations à documenter).

    Citation Envoyé par fabibass Voir le message
    (...) j'ai commis une erreur. en fait la fonction a pour prototype MID(chaine[],n1,n2) et doit me renvoyer un extrait de chaine[],commençant par le caractère numéro n1 et de longueur n2 (...)
    Ton prototype est toujours incomplet, car il n'indique pas comment est renvoyée la chaîne.

    Il est difficile d'imiter l'instruction Basic, en créant une fonction qui renvoie une chaîne d'une taille indéterminée qui serait renvoyée avec une instruction return en fin de fonction.

    La façon de faire normale en C est de laisser au programme appelant la responsabilité d'allouer un espace mémoire suffisant pour la chaîne à retourner et de passer à la fonction le pointeur sur cette chaîne.

    C'est pourquoi leternel t'a donné un exemple de prototype correct en te proposant un prototype à 4 paramètres.

    Il t'a aussi suggéré d'y travailler et de poster ton code, afin que l'on t'aide utilement.

    Vu la formulation de ta demande, il a toutes les chances que ta "demande" corresponde à l'énoncé d'un devoir qu'on te demande de faire, et je ne pense pas qu'on te rende service en faisant le travail à ta place, ni que cela soit la philosophie de ce site que de faire cela. Mais comme je suis moi même nouveau sur le forum, je peux me tromper :-)

    Bon courage !


    Eks

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fabibass Voir le message
    en fait la fonction a pour prototype MID(chaine[],n1,n2) et doit me renvoyer un extrait de chaine[],commençant par le caractère numéro n1 et de longueur n2.voila!!!!!
    Eh ben crois-le ou non, ce genre de truc n'est pas un travail de débutant.
    Il te faut allouer une zone de (n2+1) caractères (malloc), y recopier les n2 caractères de la chaine en commençant à la position n1 et rajouter en final un '\0' pour que cette zone soit conforme aux standards des chaines en C. Puis enfin renvoyer l'adresse de la zone créé. Charge alors à l'appelant de libérer ensuite (free) l'adresse reçue puisque tout malloc (allocation mémoire) implique un free (libération) et que ce n'est pas à la fonction de faire ce free sinon la zone ne serait plus utilisable par celui qui en a besoin et qui a appelé ta fonction

    Ce n'est pas un travail de débutant car il nécessite déjà une connaissance de malloc (ce qui implique alors de connaitre les pointeurs) et des différences qu'il y a entre les zones mémoires du langage (pile, tas)...

    Citation Envoyé par fabibass Voir le message
    je suis un débutant dans le langage C...
    le prototype proposé est le suivant:MID(chaine1[],chaine2[],n)...
    j'ai commis une erreur
    Proposé par qui ? Comment peut-on commettre une telle erreur de ne pas être capable de recopier un prototype donné ?? Comment peut-on te donner un tel travail à faire si tu débutes à peine en C ???

    Citation Envoyé par -Eks- Voir le message
    Dans le Basic d'antant, "MID" permettait de renvoyer une chaîne à l'intérieur d'une autre chaîne en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat$ = MID(chaine$, 10, 5)
    Ah, le basic, toute une histoire...

    Citation Envoyé par -Eks- Voir le message
    Je suppose que ce que fabibass veux faire est en fait de répliquer le fonctionnement de cette instruction.
    Oui, je l'avais envisagé (surtout quand j'ai mentionné "middle"). Mais dans ce cas le prototype ne convenait pas...

    Citation Envoyé par -Eks- Voir le message
    La façon de faire normale en C est de laisser au programme appelant la responsabilité d'allouer un espace mémoire suffisant pour la chaîne à retourner et de passer à la fonction le pointeur sur cette chaîne.
    C'est en effet une autre possibilité. L'appelant se charge alors du malloc et du free (ou bien plus simplement il a dans sa pile un tableau de la bonne taille). Mais alors il n'y a plus besoin de retourner quoi que ce soit (hormis un flag éventuel de réussite ou d'échec) et cela ne cadre plus avec l'énoncé d'origine (or moi j'aime bien l'exactitude).
    Toutefois on ne peut pas lui attribuer le qualificatif de "normale" sous-entendant que la première façon serait alors "anormale". C'est simplement une autre façon de procéder dans laquelle c'est à l'appelant de tout organiser pour que la fonction se déroule sans anicroche.

    Citation Envoyé par -Eks- Voir le message
    Mais comme je suis moi même nouveau sur le forum, je peux me tromper :-)
    Nan nan nan, c'est exactement ça. Quand l'énoncé présente un code dénotant une certaine habitude, associé à des phrases qui indiquent que le posteur sait ce qu'il dit et que c'est un pro qui a un soucis, on donnera volontier un code avec la solution. Mais si l'énoncé ressemble trop à un "TP", effectivement on ne donne plus le code. Donne un poisson à un homme et il mangera un jour, apprends-lui à pêcher et il mangera tous les jours (Lao Tzeu)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est en effet une autre possibilité. L'appelant se charge alors du malloc et du free (ou bien plus simplement il a dans sa pile un tableau de la bonne taille). Mais alors il n'y a plus besoin de retourner quoi que ce soit (hormis un flag éventuel de réussite ou d'échec) et cela ne cadre plus avec l'énoncé d'origine (or moi j'aime bien l'exactitude).
    Toutefois on ne peut pas lui attribuer le qualificatif de "normale" sous-entendant que la première façon serait alors "anormale". C'est simplement une autre façon de procéder dans laquelle c'est à l'appelant de tout organiser pour que la fonction se déroule sans anicroche.
    Comme l'énoncé d'origine n'est pas des plus fiables, je pense qu'on peut se permettre des libertés, et que fabibass a peut-être mal recopié ou interprété à sa façon ce qu'on lui demande de faire.

    Cela dit, dans son message d'origine, il mettait déjà sans son prototype (incomplet) la chaine2[] à "renvoyer" (et pas à "retourner") dans les arguments de sa fonction :-)

    fabibass devrait s'exprimer là dessus, en tout cas, on le peut pas l'aider sur l'énoncé de son problème, c'est entièrement de sa responsabilité.

    Le terme "normal" que j'ai utilisé pour affirmer que c'est au programme appelant qu'incombe la responsabilité d'allouer un espace mémoire suffisant pour la chaîne à retourner et de passer à la fonction le pointeur sur cette chaîne, n'est probablement pas très heureux. Néanmoins, c'est une façon habituelle de procéder et qui ne choque pas de développeur C qui est habitué devoir se discipliner sur le sujet avec les fonctions de la bibliothèque standard.

    En fait passer le pointeur sur la chaîne de destination en paramètre et retourner la chaîne de destination avec return ne sont pas non plus antinomiques, et on pourrait faire les deux. La fonction mid() à réaliser pourrait ainsi être vue comme une extension de la fonction standard strncpy accessible par string.h, dont le prototype est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * strncpy ( char * destination, const char * source, size_t num );
    et qui en l'occurrence, retourne aussi le pointeur sur char "destination", même si cela n'est pas indispensable au fonctionnement de strncpy, mais qui est utile si on veut directement mettre l'appel à cette fonction dans une autre fonction prenant un pointeur sur char en paramètre.

    cela donnerait quelque chose comme (la fonction mid reste à implémenter) :

    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
    #include <stdio.h>
     
    /**
     * mid() - retourne une sous-chaîne
     * @res:    C string où le résultat doit être retourné
     * @str:    C string contenant le texte à utiliser
     * @start:  index de départ (zéro est le premier caractère)
     * @len:    longueur de la sous-chaîne à rechercher
     *
     * Il est de la responsabilité de la fonction appelante
     * d'allouer une chaîne res de taille d'au moins len + 1,
     * qui contiendra le résultat renvoyé.
     *
     * Si len dépasse la taille de str à partir de start, res
     * renvoie les caractères disponibles à partir de start
     * jusqu'à la fin.
     *
     * Si start est au delà de la taille de str, une chaine
     * vide est renvoyée dans res.
     *
     * Return: res est retourné
     */
    char * mid(char * res, char * str, int start, size_t len) {
        /* fonction à implémenter */                                                                        
        return res;
    }
     
    int main(void)
    {
        char * st = "Bonjour tout le monde";
        char resultat[6] = { '\0' };                                                                        
     
        /* capture "monde" */
        mid(resultat, st, 16, 5);
        printf("résultat : %s\n", resultat);
        /* capture et affiche directement "tout" */
        printf("résultat : %s\n", mid(resultat, st, 8, 4));
     
        return 0;
    }

    Eks

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par -Eks- Voir le message
    ...Néanmoins, c'est une façon habituelle de procéder et qui ne choque pas de développeur C qui est habitué devoir se discipliner sur le sujet avec les fonctions de la bibliothèque standard.
    Mouais. Attention quand-même à ne pas négliger strdup(), readline() ou getline() qui toutes trois renvoient une zone allouée qu'il faudra alors libérer soi-même. Avec un détail pour getline() qui accepte les deux façons de procéder: soit on lui passe une zone à remplir, soit on lui passe NULL et elle alloue alors elle-même la zone pour la renvoyer. Et même si on lui passe la zone à remplir (qui doit impérativement été allouée avec une fonction de type alloc), elle a possibilité de l'agrandir si nécessaire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    strdup(), readline() ou getline() qui toutes trois renvoient une zone allouée qu'il faudra alors libérer soi-même.
    Sauf erreur (je ne les pratique pas habituellement), ce ne sont pas des fonctions standard du C, mais une fonction POSIX s'agissant de strdup() et des bibliothèques ou extensions GNU C pour readline() et getline().

    C'est très confortable sous Linux de pouvoir utiliser getline(), mais c'est malheureusement non standard.


    Eks

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous les développeurs.je ne retrouvais pas le travail que j’avais fais. Je l’ai retrouvé et c’est leternel qui avait vu juste sur le prototype car c’est le même que celui de mon ébauche. Le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char* MID(const char* chaine1,char* chain2,int initial,int longueur)
    {
        int i=0;int j=0;
        for(i=initial;i<longueur+initial;i++)
        {
            chain2[j]=chaine1[i];
            j++;
        }
        return chain2;
    }
    Le problème est que, si j’utilise cette fonction dans le programme suivant :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "fonction char.h"
    int main()
    {
        char chaine1[1000]={0};
        char chain2[1000]={0};
        printf("veuillez entrer une phrase:\n");
        scanf("%s\n",chaine1);
        printf("La phrase est:%s\n",chaine1);
        MID(chaine1,chain2,8,30);
        printf("L'extrait de la chaine commençant par le 8ieme charactere et ayant 30 characteres est:%s",chain2);
        return 0;
     
    }
    Cela ne marche pas !!!
    Le deuxième printf ne me renvoie pas exactement chaine1. si lors de ma saisie je met un « espace » ,la copie va s’arrêter à cet espace. De même que chaîne2 dans la fonction MID.
    Dans les autres cas, le curseur revient juste à la ligne quand je fini de saisir et que j’appuie « entrer » .
    Merci et toutes mes excuses pour la non clarté dans l’exposition de mon problème.

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Attention! scanf lit une saisie formatée, et considère qu'une chaine (%s) ne contient pas d'espace.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par fabibass Voir le message
    si lors de ma saisie je met un « espace » ,la copie va s’arrêter à cet espace.
    Ceci n'est pas dû à ta fonction, mais à scanf : le format %s lui impose de s'arrêter au premier caractère "blanc" qu'elle rencontre.
    Pour contrer cela, on pourra utiliser la fonction fgets à la place, ou un format un peu plus complexe (cf. ce tutoriel).

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par -Eks- Voir le message
    Citation Envoyé par fabibass Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char* MID(const char* chaine1,char* chain2,int initial,int longueur)
    {
        int i=0;int j=0;
        for(i=initial;i<longueur+initial;i++)
        {
            chain2[j]=chaine1[i];
            j++;
        }
        return chain2;
    }
    En fait passer le pointeur sur la chaîne de destination en paramètre et retourner la chaîne de destination avec return ne sont pas non plus antinomiques, et on pourrait faire les deux.
    T'avais raison. C'est exactement comme ça que ça se passe.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    @Sve@r :

    Citation Envoyé par Sve@r Voir le message
    T'avais raison. C'est exactement comme ça que ça se passe.
    :-)

    @fabibass :

    Pour l'implémentation, c'est vraiment dommage de s’embarrasser d'un scanf, si l'énoncé ne demande pas que la fonction soit testée avec une entrée au clavier, car cela parasite ton travail avec des problèmes additionnels. Sinon, les indications qui te sont données sur le fonctionnement de scanf sont exactes, et expliquent que scanf s'arrête au premier "blanc".

    Tu dois aussi contrôler le nombre de caractères pouvant être saisis, pour qu'ils ne dépassent pas la taille de 999 (tu as réservé 1000, et il faut un '\0' pour terminer la chaîne).

    Autrement, ta fonction mid comporte quelques problèmes également :

    - elle ne termine pas la chain2 avec un '\0' (tu as initialisé chain2 à 0 lors de sa déclaration dans ton code, aussi le problème ne sera pas visible dans ton code, mais il le sera dans un code où la chaîne est seulement déclarée et non initialisée à 0). Cela devrait être la responsabilité de ta fonction que de renvoyer une chaîne correctement terminée,
    - elle ne tient pas compte des cas suivants que je mentionnais dans les commentaires inclus dans la charpente de code dans mon post :
    • longueur dépasse la taille de chaine1 à partir de initial
    • initial est au delà de la taille de chaine1


    Aussi, pour l'appel à ta fonction, tu fais :

    MID(chaine1,chain2,8,30);
    printf("L'extrait de la chaine commençant par le 8ieme charactere et ayant 30 characteres est:%s",chain2);
    cela renverra quelque chose à partir du 9ème caractère, car les index de tableaux commencent à 0.

    Une dernière remarque, qui est une affaire de style. En C, on réserve en général l'usage de termes en lettres CAPITALES pour les #define. Trouver une fonction nommée "MID" est choquant pour un programmeur C. Cependant, bien sûr, si ton énoncé est comme cela, fais comme on te dit de faire.


    Eks

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous les développeurs. Merci pour votre aide. Je refais les tests en tenant compte de vos idées et surtout je vais lire la tutoriel qui m'a été proposé sur le scanf. Je vous rendrai compte.MERCI

  16. #16
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Profites-en aussi pour lire notre FAQ sur le C, pleine d'explications sur les raisons des conseils qu'on te donnera.

    J'ai moi-même beaucoup appris ainsi.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    BONJOUR et merci à vous pour votre aide!!!

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    @fabibass : Merci de cliquer sur le bouton en bas de cette page si vous n'avez plus de questions.

Discussions similaires

  1. Stdcall, Langage C et fonction dans type
    Par Champitox dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2012, 10h08
  2. Fonction random comme dans le langage Pascal
    Par habilité dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 24/07/2009, 19h58
  3. Utiliser les fonctions dans le langage c
    Par dev0712 dans le forum Débuter
    Réponses: 3
    Dernier message: 14/12/2008, 21h41
  4. [langage] Appel de fonction dans un lien
    Par drakan dans le forum Langage
    Réponses: 1
    Dernier message: 17/05/2005, 19h30
  5. Réponses: 4
    Dernier message: 26/01/2005, 14h08

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