Tri alphabétique [Résolu]

Signaler
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020
-
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020
-
Bonjour à tous. J'aimerais écrire un algorithme qui trie des chaines de caractères par ordre alphabétique mais après exécution j'obtient des caractères anormaux. Merci d'avance pour votre aide.

================================Mon code =================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void echange(char *mot1, char *mot2);
int main()
{
    int pos,len,i,j,k;
    char tmp;
    char liste [5][30];
    printf("Nous allons ranger des noms par ordre alphabetique par ordre alphabetique\n");
    printf("Veuillez entrer les noms\n");
    for(len=0;len<5;len++)
    {
        printf("Entrer le %de nom\n",len+1);
        scanf("%s",&liste[len]);
    }
    printf("L'ordre actuel des noms est:\n");
    for(i=0;i<5;i++)
    {
        printf("%s\n",liste[i]);
    }
    for (j=0;j<5;j++)
    {
    for(pos=0;pos<5;pos++)
    {
         if ((strcmp(liste[i], liste[pos]))>0)
        {
            echange(&liste[i],&liste[pos]);
        }
    }
    }
    printf("Maintenant les noms sont ordonnes \n");
    for(k=0;k<5;k++)
    {
        printf("%s\n",liste[i]);
    }
    return 0;
}

void echange(char *mot1,char *mot2)
{
    char *tmp;


*tmp= *mot1;

*mot1=*mot2;

*mot2=tmp;
}

4 réponses

Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746
bonjour, n'as-tu pas oublié de préciser quelle ligne de code générait les caractères anormaux?
as-tu testé ta fonction echange()?
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020

Au fait il me semble que c'est la fonction échange qui est défaillante. Lorsque je la teste j'ai une erreur au niveau des pointeurs
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746
comment la testes-tu?
je suggère, par ailleurs, d'utiliser %29s dans scanf.
je pense que tu devrais commencer par des exercices plus simples.
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020
>
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020

Merci pour le conseil mais pourrai je savoir ce qui cloche dans le programme ?
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020
>
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020

Je l'ai testé en la copiant dans un autre algorithme qui devait afficher les chaînes
Messages postés
13276
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
24 novembre 2020
746 >
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020

montre-nous cela.
Messages postés
5436
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 novembre 2020
914
Salut Ola_J,

Tu devrais aussi te pencher sur les avertissements du compilateur.

Chez moi, lorsque je tente de compiler ton programme, il produit un exécutable mais avec une multitude d'avertissements que tu devrais traiter un par un, en commençant par le premier.

$ gcc -Wall 36465943.c
36465943.c: In function ‘main’:
36465943.c:16:11: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
   scanf("%s",&liste[len]);
          ~^  ~~~~~~~~~~~
36465943.c:29:13: warning: passing argument 1 of ‘echange’ from incompatible pointer type [-Wincompatible-pointer-types]
     echange(&liste[i],&liste[pos]);
             ^~~~~~~~~
36465943.c:5:20: note: expected ‘char *’ but argument is of type ‘char (*)[30]’
 void echange(char *mot1, char *mot2);
              ~~~~~~^~~~
36465943.c:29:23: warning: passing argument 2 of ‘echange’ from incompatible pointer type [-Wincompatible-pointer-types]
     echange(&liste[i],&liste[pos]);
                       ^~~~~~~~~~~
36465943.c:5:32: note: expected ‘char *’ but argument is of type ‘char (*)[30]’
 void echange(char *mot1, char *mot2);
                          ~~~~~~^~~~
36465943.c:9:7: warning: unused variable ‘tmp’ [-Wunused-variable]
  char tmp;
       ^~~
36465943.c: In function ‘echange’:
36465943.c:50:7: warning: assignment to ‘char’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]
  *mot2=tmp;
       ^
36465943.c:46:6: warning: ‘tmp’ is used uninitialized in this function [-Wuninitialized]
  *tmp= *mot1;
  ~~~~^~~~~~~


Comme tes données sont supposées être dans un tableau
char liste [5][30];
pour permuter deux chaînes, tu devrais utiliser
strcpy()
ou
strncpy()
en passant par un tableau de char d'une capacité de 30 chars pour le stockage de la chaîne temporaire.

La chose serait différente si tu avais déclaré un tableau de 5 pointeurs sur char, alloué 5 espaces mémoire avec malloc pour un espace de stockage de 30 char chacun et mis les adresses mémoire vers chaque espace dans ton tableau de pointeurs. Dans ce cas tu aurais pu procéder en permutant les adresses mémoires contenues dans chaque pointeur.

Dal
Messages postés
11
Date d'inscription
lundi 17 février 2020
Statut
Membre
Dernière intervention
25 avril 2020

Merci beaucoup pour vos conseils. J'ai corrigé le programme et il est fonctionnel
=======================================Prog=================================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char tab[5][30];
char tmp[30];
int i,j,value;
printf("Veuillez entrer cinq mots. Nous allons les classer par ordre alphabetique\n");
for(i=0;i<5;i++)
{
printf("Veuillez entrer le %de nom\n",i+1);
scanf("%s",tab[i]);
}
printf("L'ordre actuel des noms est :\n");
for(i=0;i<5;i++)
{
printf("%s\n",tab[i]);
}
printf("Nous allons maintenant trier les noms\n");
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
value= strcmp(tab[i],tab[j]);
if(value<0)
{
strcpy(tmp,tab[i]);
strcpy(tab[i],tab[j]);
strcpy(tab[j],tmp) ;
}
}
}
printf("Tri termine\n");
printf("L'ordre actuel des noms est :\n");
for(i=0;i<5;i++)
{
printf("%s\n",tab[i]);
}
return 0;
}