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 :

chaine de caractere


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 53
    Par défaut chaine de caractere
    salut
    voila j'ai un probleme dans ce 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
    #include<stdio.h>
    #include<string.h>
    int main(){
    int n,i,x;
    char t[50][50];
    int *p;
    printf("entrer la dimension du tableau : ");
    scanf("%d",&n);
    for(i=0;i<n;i++){
            printf("\n entrer t[%d] :",i);
            getchar();
           // scanf("%s",t[i]);
           gets(t[i]);
        }
        printf("\n");
     for(i=0;i<n;i++){
    x=strlen(t[i]);
     printf("la longueur du mot %d est %d\n",i+1,x);
     }
     
        printf("\n");
     
     for(i=0;i<n;i++){
     
            printf("\n le mot %d est %s",i+1,t[i]);
        }
    }
    le problème ici c'est pour le strlen dans le code pour i=0 ca marche
    mais pouri=1,2,3,4,5
    strlen(forum) donne 4 et non 5
    dans l'affichage a la place forum le code affiche orum
    je ne voix pas d'où vient le problème
    merci

  2. #2
    Expert confirmé
    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
    Par défaut
    C'est à cause du getchar() qui avale le premier caractère de la ligne suivante.
    Si tu l'as mis pour supprimer le '\n' restant en attente dans le buffer après la lecture de n, il faut le sortir de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ....
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++){
       printf("\n entrer t[%d] :",i);
       gets(t[i]);
    }
    ....

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    Le probleme provient du getchar().

    Lorsque tu fais ta saisie, le premier caractere est pris par getchar(), donc, c'est normal que tu est un caractere de moins.

    Je suppose que le getchar est la pour eviter le '\n' de la precedente saisie.
    C'est l'idée, mais ce n'est pas l'application. Va faire un tour du coté de la FAQ, il y a un fonction qui permet de vider le buffer clavier.

    Sinon, des remarque au passage :

    **
    Tu as fait l'effort d'indenter, mais essai d'etre plus rigoureux. Il y a la place pour l'amelioration.


    **
    fais attention a gets, il ne permet pas de savoir si tu as taper plus de 50 caractere ! Tant qu'a securiser un minimum, autant le faire. Regarde du cote de fgets. c'est comme gets, mais en plus securiser (et c'est important).


    **
    Attention, tu declare un pointeur p et tu ne l'initialise pas.
    Je comprend que tu est du mal a voir ce qui va se passer, mais tu peux faire planter tes programme a cause de ca.
    Il faut toujours initialiser ses pointeur, soit a la bonne adresse si tu la connais, soit a NULL pour eviter une betise.

    **
    Main retourne un int. Il faut rajouter return EXIT_SUCCESS; si ce n'est pas deja fait

  4. #4
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 53
    Par défaut
    merci pour les reponses
    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
    #include<stdio.h>
    #include<string.h>
    int main(){
    int n,i,x;
    char t[50][50];
    int *p;
    printf("entrer la dimension du tableau : ");
    scanf("%d",&n);getchar();
    for(i=0;i<n;i++){
            printf("\n entrer t[%d] :",i);
     
           // scanf("%s",t[i]);
           gets(t[i]);
        }
        printf("\n");
     for(i=0;i<n;i++){
    x=strlen(t[i]);
     printf("la longueur du mot %d est %d\n",i+1,x);
     }
     
        printf("\n");
     
     for(i=0;i<n;i++){
     
            printf("\n le mot %d est %s",i+1,t[i]);
        }
    }
    ca marche bien
    le fget n'est pas reconnu
    je dois encore copier les mot terminant par oir dans un autre tableau
    je poserais le code après
    merci

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    c'est fgets

    Tu as tout le temps pour voir ces notions, ne t'inquiète pas outre mesure (mais intéresse toi y si tu veux continuer le C)

  6. #6
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 53
    Par défaut
    bonsoir
    et merci àSofEvans et diogene pour l'aide
    j'ai modifié le code
    les mots finissant par oir je dois les copier dans un autre tableau
    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
    #include<stdio.h>
    #include<string.h>
    #include<conio.h>
    int main(){
    int n,i,x,j;
    char t[50][50],m[50][50];
    char *p;
    printf("entrer la dimension du tableau : ");
    scanf("%d",&n);getchar();
    for(i=0;i<n;i++){
            printf("\n entrer t[%d] :",i+1);
           scanf("%s",t[i]);
        }
        printf("\n");
        j=0;
     for(i=0;i<n;i++){
    x=strlen(t[i]);
    p=t[i]+x-3;
    if (strcmp(p,"oir")==0)){
                m[j]=t[i];
                j++;
                }
     
     }
     //printf("\n");
     for(i=0;i<n;i++){
            printf("\n le mot %d termine par oir est %s",i+1,m[i]);
        }
        return 0;
    }
    merci d'avance

  7. #7
    Expert confirmé
    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
    Par défaut
    1-
    est incorrect : m[j] est un tableau et il est impossible d'écrire "tableau = quelque chose"

    2- Si tu veux copier la chaine, tu dois utiliser à la place strcpy()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char m[50][50];
    ....
    strcpy(m[j],t[i]);
    3- Si tu veux effectivement ne copier que le pointeur sur la chaine, alors m doit être un tableau de pointeurs, pas un tableau de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char  *m[50];
    ....
    m[j]=t[i]
    4- Le code suivant est faux si x<3 (p pointe alors AVANT le début de la chaîne, donc sur la fin du tableau précédent si il existe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x=strlen(t[i]);
    if(x>2 && strcmp(t[i]+x-3,"oir")==0){
    ....
    }
    5- La boucle d'affichage doit se terminer lorsqu'on arrive à la fin des valeurs stockées dans m. Il y en a j :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for(i=0;i<j;i++){
            printf("\n le mot %d termine par oir est %s",i+1,m[i]);
        }

  8. #8
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 53
    Par défaut
    merci pour les réponses
    mais même en modifiant le code ça ne marche pas
    merci

  9. #9
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Par défaut
    une parenthese en plus ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(p,"oir")==0))

  10. #10
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 53
    Par défaut
    voila le nouveau 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
    #include<stdio.h>
    #include<string.h>
    #include<conio.h>
    int main(){
    int n,i,x,j;
    char t[50][50],m[50][50];
    char *p;
    printf("entrer la dimension du tableau : ");
    scanf("%d",&n);getchar();
    for(i=0;i<n;i++){
            printf("\n entrer t[%d] :",i+1);
           scanf("%s",t[i]);
        }
        printf("\n");
        j=0;
     for(i=0;i<n;i++){
    x=strlen(t[i]);
    if(x>3){
    p=t[i]+x-3;
    if (strcmp(p,"oir")==0){
                strcpy(m[j],t[i]);
                j++;
                }
     }}
     for(i=0;i<j;i++){
            printf("\n le mot %d termine par oir est %s",i+1,m[i]);
        }
        return 0;
    }

    le code affiche tous les mots commençant par les mots finissant par oir puis les mots se trouvant dans la mémoire
    je ne trouve pas l'erreur
    merci

  11. #11
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Ton code à l'air correct.
    Tu arrives à te relire là ?

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par kojima Voir le message
    le code affiche tous les mots commençant par les mots finissant par oir puis les mots se trouvant dans la mémoire
    je ne trouve pas l'erreur
    Es-tu bien certain d'avoir bien recompiler le programme et d'exécuter le bon programme ?
    Parce que là la trace d'exécution ne correspond pas du tout au code fourni.

  13. #13
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 53
    Par défaut
    merci le code fonctionne bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Réponses: 13
    Dernier message: 13/06/2003, 14h13
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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