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 :

conversion d'une chaine de caractere en une matrice


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut conversion d'une chaine de caractere en une matrice
    mon programe consiste a placer un vecteur de caractere ds une matrice, mais le probleme c ke jarrive pa a afficher ma matrice :s svp veuillez tester ce code et repondez moi merci davance


    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
     
    void main()
    { char ph[200],phent[10][20];
      int  i=0,j=0,k=0;
      clrscr();
      printf("veuillez saisir la phrase d'entre:\n");
      gets(ph);
      printf("\nvotre phrase d'entre est:%s",ph);
      do
      {if(ph[i]==' ')
    				{
    				  k++;
    				  j=0;phent[k][j]=ph[i+1];
    				}
    					   else{ phent[k][j]=ph[i];
    							 j++;
     
    						   }
      i++;
      }while(ph[i]!='\0');
    	   printf("%s",phent);
     
     
    	 getch();
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Bonjour,
    1. La fonction main() retourne un int. Toujours.
    2. gets() est un bug. La première règle de gets(), c'est "Ne pas utiliser gets()". La seconde règle de gets(), c'est...
    3. Quel est précisément le rapport entre la phrase et la matrice ? Tu cherches à séparer les mots ?
    4. Tes noms de variable sont insuffisamment expressifs.
    5. Fichiers d'en-tête manquants.
    6. clrscr() et getch() ne sont pas standard, et ce sont des fioritures. Tu fignoleras quand ton code marchera...

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ce if() engendre une répétition de la lettre dans ta matrice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(ph[i]==' ') {
    	k++;
    	j=0;
    	phent[k][j]=ph[i+1];
    } else {
    	phent[k][j]=ph[i];
    	j++;
    }
    De plus, tu ne peux afficher ta matrice avec %s, puisque les différentes lignes ne sont pas terminées par le caractère nul nécessaire...

  4. #4
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Pas de langage SMS SVP !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	   printf("%s",phent);
    comment tu veut afficher la matrice avec la fonction printf(); ?
    phent pointe sur phen[0][0] ( si c'est vrais ), alors la matrice ne sera pas afficher en totalité ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       do
      {if(ph[i]==' ')
    				{
    				  k++;
    				  j=0;phent[k][j]=ph[i+1];
    				}
    					   else{ phent[k][j]=ph[i];
    							 j++;
     
    						   }
      i++;
      }while(ph[i]!='\0');
    d'après le code tu veut avoir chaque mot dans une ligne de la matrice ....
    voici la correction que je peut les mentionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int k = j = 0;
    for(i=0, ph[i]!='\0', i++)
       {
     if(ph[i]==' ')
       				{
        				  k++;
        				  j=0;
       				}
       					   else{ 
       phent[k][j]=ph[i];
        							 j++;
       						   }
       }
    j'ai pas tester le code, alors je sais pas si ca marche ou non, mais d'après moi, c'est comme ça qu'il faut faire !!!

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Bonjour,
    1. La fonction main() retourne un int. Toujours.
    2. gets() est un bug. La première règle de gets(), c'est "Ne pas utiliser gets()". La seconde règle de gets(), c'est...
    3. Quel est précisément le rapport entre la phease et la matrice ? Tu cherches à séparer les mots ?
    4. Tes noms de variable sont insuffisamment expressifs.
    5. Fichiers d'en-tête manquants.
    6. clrscr() et getch() ne sont pas standard, et ce sont des fioritures. Tu fignoleras quand ton code marchera...
    Moi aussi je suis d’accord que la fonction gets() ; est un beug
    Mais j’ignore pour quoi elle l’est.
    Ou bien pour quoi tous le monde nous déconseille de l’utiliser

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    L'explication est bien 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
    #include <stdio.h>
     
    void Bug(void)
    {
    	char bufofl[10];
     
    	printf("Taper une chaîne : ");
    	fflush(stdout);
     
    	gets(bufofl);
    	printf("Vous aves tape :%s\n", bufofl);
    }
     
    int main(void)
    {
    	puts("Avant...");
    	Bug();
    	puts("Apres!");
    	return 0;
    }
    Compile ce code en désactivant les optimisations pour être sûr que la fonction ne sera pas inlinée, lance le prog et tape: "abcdefghijklmnopqrstuvwxyz". En théorie, le programme devrait planter avant d'avoir pu afficher "après".

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Mais ça fait 2 ans que je travaille avec la fonction fgets j’ai jamais eu de problème ‘beug’ en plus c’est le prof qui nous a apprit cette fonction.
    Avec ma petite expérience je pense qu’on peut utiliser la fonction gets sans aucun problème

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Avec fgets(), aucun problème.
    Avec gets(), as-tu testé mon code ?

  9. #9
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par dot-_-net Voir le message
    Mais ça fait 2 ans que je travaille avec la fonction fgets j’ai jamais eu de problème ‘beug’ en plus c’est le prof qui nous a apprit cette fonction.
    Avec ma petite expérience je pense qu’on peut utiliser la fonction gets sans aucun problème
    tu sais quoi, parce que gets() c'est une fonction des norme C89 et C99 trés vieux, elle n'est pas POSIX (pas portable sur n'importa qu'elle système) C'est comme la déclaration des fonctions :
    avant on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int test(test, test)
    int test;
    int test;
    {
     
    ....
     
    }

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tiens, j'ai amélioré le code, maintenant il met forcément en évidence le bug même si on l'optimise!
    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 <stdio.h>
     
    struct ofl
    {
    	int unEntier;
    	char buf[10];
    	int unAutreEntier;
    };
     
    void Bug2(struct ofl *pofl)
    {
    	printf("Taper une chaine : ");
    	fflush(stdout);
     
    	gets(pofl->buf);
    	printf("Vous aves tape :%s\n", pofl->buf);
     
    	printf("unEntier = %d, unAutreEntier = %d\n", pofl->unEntier, pofl->unAutreEntier);
    }
     
    void Bug(void)
    {
    	struct ofl o = { 42, "", 42 };
    	Bug2(&o);
    }
     
    int main(void)
    {
    	puts("Avant...");
    	Bug();
    	puts("Apres!");
    	return 0;
    }
    Sur une architecture little-endian comme le x86, il suffit de taper une chaîne de 10 caractères ou plus.
    Sur une architecture big-endian, il faut taper au moins 11 caractères pour montrer le bug.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    tu sais quoi, parce que gets() c'est une fonction des norme C89 et C99 trés vieux
    Ne dis pas de bêtises avec les normes. La norme C99 est la dernière norme du C en date, et gets() en fait toujours partie pour de sombres raisons de compatibilité antérieure...

  12. #12
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ne dis pas de bêtises avec les normes. La norme C99 est la dernière norme du C en date, et gets() en fait toujours partie pour de sombres raisons de compatibilité antérieure...
    désolé, mais c'est ce que j'ai pensé ... !!!!

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    tu sais quoi, parce que gets() c'est une fonction des norme C89 et C99 trés vieux, elle n'est pas POSIX (pas portable sur n'importa qu'elle système) C'est comme la déclaration des fonctions :
    En principe, POSIX.1 englobe C99. gets() est donc POSIX. C'est pour des raisons de sécurité qu'il est déconseillé de l'utiliser. Rien à voir avec la norme...

    Thierry

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    désolé, mais c'est ce que j'ai pensé ... !!!!
    quand on poste ici (surtout un conseil) on ne PENSE pas (qudn on parle de normes) on se renseigne

    Surtout en etant debutant.....

    Et meme quand on ne l'est pas (ca m'arrive a moi aussi )

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2008, 13h44
  2. erreur pour une insertion d'une chaine de caractere dans une cellule
    Par amel95140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 09h09
  3. Extraire le premier caractere d'une chaine de caractere
    Par Shikamaru86 dans le forum C++Builder
    Réponses: 6
    Dernier message: 21/09/2006, 09h14
  4. comparer une valeur de formulaire et une chaine de caractere.
    Par minirom dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/08/2006, 10h53
  5. Réponses: 2
    Dernier message: 04/11/2005, 11h35

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