2010-10-14 9 views
2

J'ai eu du mal à écrire un code simple pour trier un tableau de char en C et échoué lamentablement. Voilà ce que j'ai jusqu'à présent:Trier un tableau de char dans C

int main() 
{ 
    char line[128]; 
    char word[128]; 
    int i=0; 
    int j; 
    int length; 

    while(fgets(line,sizeof line,stdin) != NULL) 
    { 
    length=0; 
    i=0; 

    while (line[i]!='\0') 
     i++; 

    length=i; 

    line[i-1]=line[i]; 

    for (i=0;i<=length;i++) 
     word[i]=line[i]; 

    for (i=length-1; i>=0; i--) 
    { 
     for (j=0;j<i;j++) 
     { 
     if (line[j] > line[i]) 
     { 
      char temp; 
      temp=line[j]; 
      line[j]=line[i]; 
      line[i]=temp; 
     } 
     } 
    } 

    printf("%s %s\n",line,word); 
    } 
    return 0; 
} 

fichier d'origine:

overflow 
array 
test 
string 
stack 

fichier de sortie:

overflow 
array 
test 
string 
stack 

Cela me donne des résultats plutôt inattendus. Où vais-je mal?

+1

Pouvez-vous définir des "résultats inattendus"? Cela fonctionne parfaitement pour moi. – casablanca

+0

Peut-être un 'printf()' cassé? – ruslik

+0

@casablanca: Si cela fonctionne pour moi, alors le problème est ailleurs dans mon code. Laissez-moi regarder dans – xbonez

Répondre

3

Change:

length = i; 

à:

length = i - 1; 

et cela fonctionne.

Lorsque vous faites line[i-1] = line[i]; vous supprimez le \n (qui est placé là par fgets) de la ligne et en réduisant efficacement la longueur de chaîne de 1. Vous devriez en tenir compte.

Avec votre code actuel, la longueur inclut le séparateur nul, qui est trié au début de la chaîne, par conséquent votre résultat est une chaîne vide.

+0

fonctionne! merci beaucoup. – xbonez

2

ce que je pensais, en évitant le CR/LF:

length=i; 
line[i-1]=line[i]; 

vous avez inclus le '\0' characted dans la chaîne à trier. Cela arrivera en premier lieu, donc vous aurez une chaîne vide à imprimer.

1

Vous retirez la \n de la ligne en le remplaçant par \0 mais votre calcul length se fait avant ce changement.

Pour corriger cela,

line[i-1]=line[i]; 

avant de calculer la longueur.

Depuis votre length est un de plus que la longueur réelle, \0 prend également en tant char à trier et depuis son plus petit de tous char, il est placé au début de la chaîne, ce qui rend efficacement votre chaîne vide .