2017-08-31 3 views
2

J'ai un tableau de pointeurs à chaîne:C de type char qsort dans le tableau des pointeurs sur des chaînes

char *TAB[3] = { "dafafa", "alfkasf", "bafgr" }; 

Je voudrais trier caractères dans chacune de ces chaînes.

Ma fonction de comparaison:

int cmp(const void *a, const void *b) 
{ 
    return *(char *)a - *(char *)b; 
} 

et en essayant qsort sur un de ces:

qsort(TAB[0], 6, sizeof(char), cmp); 

Le programme ne fonctionne pas. Après de nombreux efforts, j'ai constaté que la raison du problème est de livrer TAB[0] à qsort().

Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas et comment résoudre ce problème?

+6

Les chaînes littérales en C sont * en lecture seule *. Tenter de les modifier conduit à [* undefined behavior *] (https://en.wikipedia.org/wiki/Undefined_behavior). –

+0

"Je voudrais trier les caractères dans chacune de ces chaînes." -> et où voudriez-vous mettre cette chaîne triée étant donné que l'écriture dans la chaîne source, un _string literal_, est _undefined behavior_? – chux

Répondre

4

Si vous voulez trier les caractères à l'intérieur de chaque chaîne, la première chose à faire est de pouvoir écrire vos chaînes. En l'état, vos chaînes sont en lecture seule, vous ne pouvez donc pas trier leurs caractères sans copier leur contenu dans la mémoire qui permet d'écrire.

Ensuite, vous avez besoin d'une boucle. Comme vous triez chaque chaîne individuellement, vous devez parcourir le tableau en boucle et appeler le qsort sur chaque élément. L'élément initial est TAB[i] et la longueur est strlen(TAB[i]). Votre cmp fonctionnera.

+0

Comment savez-vous que ces chaînes sont en lecture seule? Pourriez-vous me montrer un exemple de code qui peut résoudre ce problème? J'ai vérifié qu'après avoir déclaré 'char tab [] =" dafafa "' au lieu de 'char * tab =" dafafa "' cela a fonctionné. Quelle est la différence là-bas? –

+3

@ PiotrWitkoś Tous les littéraux de chaîne sont en lecture seule, dans le sens où vous n'êtes pas autorisé à modifier leur contenu. 'char tab [] =" dafafa "' est différent, car vous initialisez un tableau de caractères avec une chaîne littérale. Ce tableau devient accessible en écriture. 'TAB [3]' dans votre code original est un tableau de pointeurs, donc c'est très similaire à 'char * tab =" dafafa "' répété trois fois. Vous pouvez vérifier [ici] (https://ideone.com/1eqKyG) pour voir comment copier correctement les chaînes. – dasblinkenlight

+0

J'ai une question dans mon examen pour trier les caractères dans chaque chaîne dans un tableau de chaînes 'TAB [100]'. Comment le déclareriez-vous pour éviter de copier le contenu? –