Vous avez un comportement non défini dans votre fonction de tri.
Il y a deux raisons à cela :
Vous utilisez un tableau de pointeurs, et chaque pointeur pointe sur une chaîne littérale ;
Vous utilisez strcpy pour copier le contenu entre les chaînes.
En C, tenter de modifier une chaîne littérale est un comportement non défini. Les chaînes littérales sont essentiellement en lecture seule. Notez qu’elles ne sont pas constantes, même s’il est toujours recommandé d’utiliser des pointeurs const.
Vous avez deux possibilités pour résoudre ce problème :
Utiliser plutôt un tableau de tableaux :
char tab[][10] = { ... };
Le contenu des chaînes est alors modifiable, et vous pouvez utiliser strcpy.
Le problème est que vous utilisez strcpy() avec des chaînes de caractères littérales, ce qui n’est pas autorisé. Si vous permutez les pointeurs, votre algorithme fonctionne parfaitement. Voici une version mise à jour de sort() :
void sort(char *ar[],int n)
{
int i,j;
char* tmp;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-i-1;j++)
{
if (strcmp (tab[j], tab[j + 1] ) > 0) // plus lisible qu'avant
{
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
printf ("%s\n", tmp);
}
}
}
}