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 :

chaîne de caractères


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut chaîne de caractères
    Bonjour je débute en C, et j'essaye de faire un exercice décomposant une chaîne de caractère d'une certaine façon :

    °Pour commencer on a :

    aa:bb:ccc:d

    °et on veut afficher :

    aa
    bb
    ccc
    d


    °avec une boucle for.

    Voici 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
    34
    35
    36
    37
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char** argv){
    
    char** fragments;
    int nb_fragments=1;
    int i=0;
    
    while(argv[1][i]!='\0'){                                               /* on circule sur la chaîne de caractère pour compter le nombre de fragments */
    
        if(argv[1][i]==':'){
        nb_fragments=nb_fragments+1;
        }
    }
    
    fragments=malloc(nb_fragments* sizeof(char*));            /* chaque fragment aura une case de taille sizeof */
    fragments[num_fragments]=argv[1];
    
    num_fragments+1;
    i=0;
    
    while(argv[1][i]!='\0'){
    
        if(argv[1][i]==':'){
        fragments[num_fragments]=argv[1]+i+1;
        num_fragments+1;
        }
    }
    i+1;
    
    for(i=0,i<nb_fragments,i+1){
    
    printf("s%\n",*fragments(num_fragments)[i]);
    }
    
    }
    Après compilation j'ai 4 erreurs lignes 18 et 34, au niveau du num_fragments qui n'est pas déclaré mais je ne sais pas sous quel forme je doit le faire, dans mon dernier printf on me dit que fragments n'est pas une fonction.

    Quelqu'un pourrait-il m'aider à comprendre tout cela et m'indiquer comment corriger mes erreurs ?

    Merci d'avance

  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 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jarell Voir le message
    Bonjour je débute en C, et j'essaye de faire un exercice décomposant une chaîne de caractère d'une certaine façon :

    °Pour commencer on a :

    aa:bb:ccc:d

    °et on veut afficher :

    aa
    bb
    ccc
    d


    °avec une boucle for.

    Voici 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
    34
    35
    36
    37
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char** argv){
    
    char** fragments;
    int nb_fragments=1;
    int i=0;
    
    while(argv[1][i]!='\0'){                                               /* on circule sur la chaîne de caractère pour compter le nombre de fragments */
    
        if(argv[1][i]==':'){
        nb_fragments=nb_fragments+1;
        }
    }
    
    fragments=malloc(nb_fragments* sizeof(char*));            /* chaque fragment aura une case de taille sizeof */
    fragments[num_fragments]=argv[1];
    
    num_fragments+1;
    i=0;
    
    while(argv[1][i]!='\0'){
    
        if(argv[1][i]==':'){
        fragments[num_fragments]=argv[1]+i+1;
        num_fragments+1;
        }
    }
    i+1;
    
    for(i=0,i<nb_fragments,i+1){
    
    printf("s%\n",*fragments(num_fragments)[i]);
    }
    
    }
    Après compilation j'ai 4 erreurs lignes 18 et 34, au niveau du num_fragments qui n'est pas déclaré mais je ne sais pas sous quel forme je doit le faire
    Ben à quoi sert cette variable ??? A stocker un nombre entier ? un flottant ? un caractère ? ...
    Citation Envoyé par Jarell Voir le message
    Dans mon dernier printf on me dit que fragments n'est pas une fonction.
    Ben oui, la syntaxe "token(...)" symbolise un appel de fonction !!!

    Citation Envoyé par Jarell Voir le message
    Quelqu'un pourrait-il m'aider à comprendre tout cela et m'indiquer comment corriger mes erreurs ?
    En retournant étudier les bases de la syntaxe du C parce qu'il y a quelques lacunes. Par exemple écrire "num_fragments+1" c'est pas super efficace.
    Ensuite tu rajoutes quelques printf() pour vérifier tes résultats. Parce que tu n'es pas vraiment loin du but...
    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
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Bonjour jarell

    Erreur ligne 18:
    E:\tmp\test\Test.c(18) : error C2065: 'num_fragments' : undeclared identifier
    Le texte me parait clair, tu n'a pas déclaré la variable num_fragments.

    ligne 20:
    Cette ligne ne sert à rien car le résultat de l'addition n'est pas affecté à une variable.

    ligne 27:
    même chose qu'en ligne 20:

    ligne 30:
    même chose pour i+1;

    Ligne 38:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0,i<nb_fragments,i+1){
    Chaques élements d'une boucle for sont séparés par des ; et non pas des ,. Le i+1 ne fera rien.

    Si tu veux ajouter 1 à une variable, utilise plutôt i++;

    N'oublie pas d'indenté ton code, ce sera plus lisible.
    Et pour finir, je ne suis par convaincu que ce code va faire ce que tu souhaite

    Si tu regarde dans les fonctions qui manipulent les chaines de caractères, tu devrais trouver plus simple.

    Bon courage.
    Page sur Developpez : http://pbriand.developpez.com

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    merci beaucoup pour vos conseils je vais de suite retravailler tout ça.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    Bonjour

    Après avoir retravailler sur mon code je me retrouve avec 0 erreurs. Le problème est que lorsque je lance l'exe le programme plante et ne fonctionne pas.
    Donc je me permet de solliciter une nouvelle fois votre aide si possible.

    Voici la nouvelle version de 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
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char** argv){
     
    char* Stringsplit = "aa:bb:ccc:d";
    char** fragments;
    int nb_fragments=1;
    int num_fragments=0;
    int i=0;
     
    argv[1][1] = *Stringsplit;
     
    while(argv[1][i]!='\0'){                                /* on circule sur la chaîne de caractère pour compter le nombre de fragments */
     
        if(argv[1][i]==':'){
            nb_fragments=nb_fragments+1;
        }
        i++;
    }
     
    fragments=malloc(nb_fragments* sizeof(char*));          /* chaque fragment aura une case de taille sizeof */
    fragments[num_fragments]=argv[1];
    num_fragments++;
    i=0;
     
    while(argv[1][i]!='\0'){
     
        if(argv[1][i]==':'){
            fragments[num_fragments]=argv[1]+i+1;
            num_fragments++;
        }
    }
    i++;
     
    for(i=0;i<nb_fragments;i++){
     
        printf("s%\n",fragments[i]);     /* c'est la variable fragment qui est allouée */
        }
     
    }
    Merci encore pour vos conseils

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Oula !!

    Déja tu malloc mal ton tableau à 2 dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fragments=malloc(nb_fragments* sizeof(char*));
    Là tu n'a malloc que le tableau de chaine de charactères mais les chaines en elle même.

    Ce qu'il faut que tu fasse c'est que tu boucle de 0 à nb_fragments dans ton tableau (après l'avoir malloc comme tu l'as fait) et que tu malloc chaque ligne de la taille que tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fragments=malloc((nb_fragments + 1) * sizeof(char*));
    for (i = 0; i > nb_fragments; ++i)
      fragments[i] = malloc((la_taille_que_tu_veux + 1) * sizeof(char));
    Ensuite j'ai du mal à comprendre ton intention vis à vis du argv. Déja, cette variable est une variable fourni par le système qui représente les arguments passés à ton programme. Même si c'est possible, la convention veut que l'on n'écrive pas dedans mais qu'on la lise simplement.

    Ensuite la chaine que tu veux splitter est déja stockée dans la variable Stringsplit, alors pourquoi l'assigner a argv[1][1], ce qui par dessus tout fonctionne mais n'a peut-être pas le comportement que tu espère. La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    argv[1][1] = *Stringsplit;
    stock le premier charactère de Stringsplit dans la deuxième case de la deuxième ligne de argv.

    Ensuite, nb_fragments représente le nombre de fragments maximum, alors pourquoi t'en servir comme incrémenteur?

    Voila pas mal de petites erreurs par ci par la.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Tu te simplifierais la vie si tu utilisais la fonction strtok.

  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 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Tu te simplifierais la vie si tu utilisais la fonction strtok.
    J'y ai pensé aussi (enfin perso je préfère strtok_r() qui est réentrante) mais je me suis dit qu'il devait s'agir d'un exercice...
    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
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    L'inconvénient de strtok_r() est que rien ne garantit sa présence, pas même le standard C99 (je viens de vérifier n1256/pdf, elle n'apparaît pas dedans).

    À partir de VS 2005, Microsoft a produit un équivalent sous le nom strtok_s().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Dans le pire des cas, on peut toujours trouver des implémentations de la fonction sur le net.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  3. Chaînes de caractères
    Par Zazeglu dans le forum C
    Réponses: 3
    Dernier message: 28/08/2003, 16h20
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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