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 :

Affichage incompréhensible (pour ma part)


Sujet :

C

  1. #1
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut Affichage incompréhensible (pour ma part)
    Bonjour à tous

    Une petite explication de mon application :
    Via un menu, l'utilisateur peut ajouter un CD dans une médiathèque et/ou afficher le contenu de la médiathèque.
    Lors de l'ajout, le programme demande à l'utilisateur de saisir :
    • Id du CD (avec un nbr de caractère imposé)
    • Titre du CD
    • Année du CD
    • Nom de l'artiste
    • Prénom de l’artiste


    Sachant que j'ai deux structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct {	char prenom [20];
    	char nom[20];
    }Interpretes ;
     
     
    typedef struct {
    	char id [8];
    	char titre [20];
    	int annee;
    	Interpretes chanteur;
    } CD;
    J'ai donc créer une fonction pour la saisi des CD :
    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
    // FONCTION D'AJOUT DE CDCD AjoutCD(CD *tbl,int index) {
    	int cont=1;
    	int length=0;
    	do {
    		printf("ID (12 caractéres) : ");
    		scanf("%s%*[^\n]", tbl[index].id);
    		length=strlen(tbl[index].id);
    		if (length!=12) {
    			printf("Format incorrect (le nbr de caractéres doit etre de 8)\n");
    			viderBuffer();
    		}
    		viderBuffer();
    	} while(length!=12);
    	getchar();
    	printf("Titre (mettre des \'_\' à la place des espaces) : ");
      scanf("%s%*[^\n]", tbl[index].titre);
    	getchar();
    	do {
    		printf("annee : ");
    		scanf("%d", &tbl[index].annee);
    		getchar();
    		if (tbl[index].annee==0) {
    			printf("Veuillez saisir une annee en chiffres !!\n");
    			viderBuffer();
    			cont=0;
    		}
    		else
    		{
    			cont=1;
    		}
    	} while(cont==0);
      printf("Prenom (mettre des \'_\' à la place des espaces) : ");
      scanf("%s%*[^\n]", tbl[index].chanteur.prenom);
    	getchar();
      printf("Nom (mettre des \'_\' à la place des espaces) : ");
      scanf("%s%*[^\n]", tbl[index].chanteur.nom);
    	getchar();
    }
    Puis, j'ai un code qui va trier les albums par année et par titre et les affichent :
    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
    48
    49
    50
    51
    52
    53
    // FONCTION D'AFFICHAGE DES CD AVEC TRISvoid AfficheCD(CD tbl[1000],int index) {
    	/*
    	* Tri par années
    	*/
      int continuer=1;
      CD temp;
      while (continuer==1) {
        continuer=0;
        for (int i= 0; i<index-1; i++) {
          if (tbl[i].annee>tbl[i+1].annee) {
            temp=tbl[i];
            tbl[i]=tbl[i+1];
            tbl[i+1]=temp;
            continuer=1;
          }
        }
      }
    	/*
    	* Tri par titre
    	*/
    	int continuer_titre=1;
    	while (continuer_titre==1) {
    	 continuer_titre=0;
    	  for (int i= 0; i<index; i++) {
    	  	if (tbl[i].annee==tbl[i+1].annee) {
    	      CD temp_titre;
    	      int compare;
     
     
    	      compare=strcmp(tbl[i].titre,tbl[i+1].titre);
     
     
    	      if (compare>0) {
    	        temp_titre=tbl[i];
    	        tbl[i]=tbl[i+1];
    	        tbl[i+1]=temp_titre;
    	        continuer_titre=1;
    	      }
    	    }
    	  }
    	}
     /*
     * Affichage
     */
    	for (int i= 0; i<index; i++) {
    	printf("| %-20s| %-20s| %-7d| %-20s| %-20s|\n",
    	  tbl[i].id,
    	  tbl[i].titre,
    	  tbl[i].annee,
    	  tbl[i].chanteur.nom,
    	  tbl[i].chanteur.prenom);
    	}
    }
    Mon problème (car il y en a un quand même ^), c'est que j'ai un problème à l'affichage des albums :
    Nom : capture2.jpg
Affichages : 126
Taille : 24,8 Ko

    Le titre s'affiche aussi avec l'ID du CD.

    Une idées SVP. J'ai beau chercher, je trouve pas (peut être un manque d’expérience).

    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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    A vue de nez, tu ne réserves pas d'espace pour stocker ton '\0'. Ben oui, si l'identifiant est une string de 8 caractères, comme une string se termine obligatoirement par un '\0' alors son stockage format C en occupera 9. Et comme les fonctions d'affichage de chaines se basent sur ce '\0', ben s'il n'y est pas (ou qu'il a été écrasé) l'affichage continue dans la zone mémoire qui suit. Et comme une structure est toujours contigüe en mémoire, le printf() commence par afficher l'id et continue sur le titre...

    Généralement, une façon d'écrire ce type de structure se fait de cette façon
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	char prenom [20+1];
    	char nom[20+1];
    }t_interpretes ;
    afin que tous les lecteurs éventuels sachent que t'as bien pensé au '\0'. Et un type se préfixe par "t_".

    Par ailleurs, je ne pige pas trop ce test sur "12" alors que visiblement la taille de l'identifiant est de 8; ni pourquoi tu appelles viderBuffer() en ligne 10 et aussi en ligne 12. Perso j'aurais plutôt écrit la boucle de saisie ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (1) {
    	printf("ID (8 caractéres) : ");
    	scanf("%s%*[^\n]", tbl[index].id);
    	viderBuffer();
    	if (strlen(tbl[index].id) == 8) break;
    	printf("Format incorrect (le nbr de caractéres doit etre de 8)\n");
    }
    Ce qui évite toutes ces redondances. Toutefois ça n'évite pas le dépassement de capacité car quand le test se fait, le scanf a déjà stocké ce qui a été saisi. Ou dit autrement, si l'utilisateur saisit 150 caractères, ben ces 150 caractères iront se stocker dans des zones trop petites avant que tu puisses les compter et détecter le souci. Si tu veux vraiment contrôler la taille saisie, alors faut passer par fgets() qui offre une limitation du nombre de caractères à saisir.

    Et sinon un usage des #define te permettrait de factoriser tes limites écrites en dur (aujourd'hui 8, demain 10 etc)...
    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
    Débutant   Avatar de FCL31
    Profil pro
    Inscrit en
    Août 2007
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 885
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    A vue de nez, tu ne réserves pas d'espace pour stocker ton '\0'.
    Ah beh oui, je suis c...


    Citation Envoyé par Sve@r Voir le message
    Par ailleurs, je ne pige pas trop ce test sur "12" alors que visiblement la taille de l'identifiant est de 8
    J'ai mis que des partis de code. POur certains trucs, l'id fait fait 8 caractères et pour d'autres, l'ide fait 12 caractères.




    Citation Envoyé par Sve@r Voir le message
    Perso j'aurais plutôt écrit la boucle de saisie ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (1) {
        printf("ID (8 caractéres) : ");
        scanf("%s%*[^\n]", tbl[index].id);
        viderBuffer();
        if (strlen(tbl[index].id) == 8) break;
        printf("Format incorrect (le nbr de caractéres doit etre de 8)\n");
    }
    Je vais étudier la question

    Citation Envoyé par Sve@r Voir le message
    Et sinon un usage des #define te permettrait de factoriser tes limites écrites en dur (aujourd'hui 8, demain 10 etc)...
    Comme je suis en formation, même si j'ai déjà vu #define a titre perso vite fait, on l'a pas vu en cours .

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

Discussions similaires

  1. Affichage incompréhensible sous IE
    Par trotters213 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/10/2006, 23h08
  2. Affichage bizarre pour une classe lettre
    Par Aline2611 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 07/08/2006, 09h27
  3. Réponses: 4
    Dernier message: 07/04/2006, 16h30
  4. Réponses: 2
    Dernier message: 14/03/2005, 19h55

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