2016-03-30 15 views
0

C kullanarak diziler içeren bir okul projesi yapıyorum. Şu anda dize dizisini alfabetik sıraya göre sıralamaya çalışıyorum. Bunu başarılı bir şekilde yapamıyorum. P:Dize dizilerini sıralama

void sort_string_array(char **table) 
{ 
    int i = 0; 
    while (table[i++] != NULL);    // to get the length 
    qsort(table, i, sizeof(char *), strcmp); // sorting 
} 

bu tamamen yanlış bir çözümü tarzı mı sorun ne ben kapatmak am,: Ben bugüne kadar yapmış basitleştirilmiş kodudur? Herhangi bir yardım harika olurdu!

DÜZENLEME:

void sort_string_array(char **table) 
{ 
    int i = 0; 
    while (table[i] != NULL) i++;    // to get the length 
    qsort(table, i, sizeof(char *), strcmp); // sorting 
} 

o hatayı düzelttikten sonra yine sağ fuctioning değildir. Dize {'bir', 'iki', 'üç', 'dört'} kullanarak bu türün ilk değeri 'dört' olmalıdır, ancak 'iki' olur}}

+0

Olası çoğaltılabilir [Bir dizgeyi alfabetik olarak nasıl sıralar (büyük/küçük harfe duyarlı, standart olmayan harmanlama)] (http://stackoverflow.com/questions/12646734/how-to-sort-an-array-of-string -alphabetically-case-duyarlı-standart olmayan-kol) – AngryDuck

+0

Bu kod çalışmıyor mu? – blazs

+0

Karşılaştırma işlevini göster. – 2501

cevap

2

Başka bir öğe kullanıyorsunuz ve muhtemelen dışarıdan erişiyorsunuz

: dizi

sınırları
while (table[i++] != NULL); 

qsort ve strcmp kullanımı ile ilgili Cı-SSS bir reference vardır

while (table[i] != NULL) i++; 

olmalıdırQ: Karşılaştırma işlevi olarak strcmp kullanarak bir dizi dizeyi qsort ile sıralamaya çalışıyorum, ancak çalışmıyor.

A : Dizelerin dizisi olarak, muhtemelen char için işaretçi dizisi anlamına gelir. Qsort'un karşılaştırma işlevine ilişkin argümanlar, sıralanan nesneler için işaretçilerdir, bu durumda, char işaretçilerine işaretçilerdir. Ancak strcmp, char için basit işaretçileri kabul eder. Bu nedenle, strcmp doğrudan kullanılamaz. Böyle bir ara karşılaştırma işlevi yazın:

/* compare strings via pointers */ 
int pstrcmp(const void *p1, const void *p2) 
{ 
    return strcmp(*(char * const *)p1, *(char * const *)p2); 
} 

karşılaştırma işlevin argümanları genel işaretçiler olarak ifade edilir, void *. Onlar gerçekten ne olduklarına (char için işaretçiler için işaretçiler) geri dönüştürülür ve strcmp'e iletilebilen char * 'lar çıkarılır.

qsort çağrısı gibi görünebilir

#include <stdlib.h> 
char *strings[NSTRINGS]; 
int nstrings; 
/* nstrings cells of strings[] are to be sorted */ 
qsort(strings, nstrings, sizeof(char *), pstrcmp); 

(. K tartışma & R2 Sec tarafından Standart kütüphanenin qsort değerlendirmediğini 5.11 s. 119-20, yanıltılmış ve olmayın char * ve void *) denkliği hakkında sessiz ve gereksiz bir varsayım yapar.

qsort karşılaştırma işlevleri - nasıl çağrıldıkları ve nasıl bildirilmesi gerektiği - hakkında daha fazla bilgi için soru 13.9'a bakın.

Referanslar: ISO Sec. 7.10.5.2 H & S Sec. 20.5 p. 419

+0

Oh, benim yaptığım çok garip bir hata, çok teşekkürler :) – Duzzz