sortowanie tablicy wskaźników

0

Witajcie, mam problem z sortowaniem tablicy wskaźników funkcją qsort.
Zadaniem tej funkcji jest posortowanie wyrazów w łańcuchu (każdy kolejny wyraz oddzielony spacją).
W funkcji wpisuję ten łańcuch do tablicy dwuwymiarowej (wyraz po wyrazie). Następnie chcę ją posortować i tu mam problem, ponieważ nie działa to tak jak powinno.

Kod:

int porownanie(const void *a, const void *b)
{
	int wynik;
	char *_a = (char*)a;
	char *_b = (char*)b;
	wynik = strcmp(_a, _b);
	return wynik;
}
Tekst* sortuj(Tekst *mt)
{
	char **bufor;
	int i, j, k;
	j = 0;
	k = 0;
	int licznik = 1;
	bufor = (char**)malloc((mt->lw) * sizeof(char*));
	bufor[0] = (char*)malloc(25 * sizeof(char));
	while ((mt->t[j]) != ' ')
	{
		bufor[0][j] = (mt->t[j]);
		j++;
		bufor[0][j] = '\0';
	}
	for (i = 0; i < (mt->r); i++)
	{
		if ((mt->t[i]) == ' ')
		{
			bufor[licznik] = (char*)malloc(25 * sizeof(char));
			j = 0;
			k = i + 1;
			while ((mt->t[k]) != ' ')
			{
				bufor[licznik][j] = (mt->t[k]);
				k++;
				j++;
				bufor[licznik][j] = '\0';
			}
			licznik++;
		}
	}
	qsort(bufor, (mt->lw), (sizeof(char*)), porownanie);
} 
0

Wiem, ale nie w tym problem. Przechodzą kod breakpointami linijka po linijce już widzę że nie działa prawidłowo (qsort przekazuje do funkcji porownanie złe wskaźniki)

0
typedef struct Tekst_
{
	char *t; //wskaźnik na tekst
	int r; //rozmiar tekstu w bajtach
	int lw; //liczba wyrazów w tekście 
} Tekst;
1

Tak generalnie to kod na górze właściwie nic dobrze nie wykonuje.

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

int count_words(const char *s)
{
	int result = 0;
	while(*s++) 
	{
		if(*(s-1) == ' ') result = result + 1;
	}
	return result + 1;
}

int word_len(const char *s)
{
	return (strchr(s, ' ') != 0) ? (strchr(s, ' ') - s) : (strlen(s));
}

int compare(const void *s1, const void *s2)
{
	const char **ia = (const char **)s1;
    const char **ib = (const char **)s2;
    return strcmp(*ia, *ib);
}

char **my_sort(const char *s, int *nwords)
{
	int words, wordlen, i;
	char **buffer;

	words = count_words(s);
	buffer = (char **)malloc(words * sizeof(char *));
	for(i = 0; i < words; i = i + 1)
	{
		wordlen = word_len(s);
		buffer[i] = (char *)malloc(wordlen + 1);
		memcpy(buffer[i], s, wordlen);
		buffer[i][wordlen] = '\0';
		s = s + wordlen + 1;
	}
	qsort(buffer, words, sizeof(char *), compare);
	*nwords = words;
	return buffer;
}

void destroy_char_pp(char **s, int n)
{
	int i;

	for(i = 0; i < n; i = i + 1)
	{
		free(s[i]);
	}
	free(s);
}

int main()
{
	int nwords, i;
	char **words;

	words = my_sort("Ala ma kota a kot ma ale", &nwords);

	for(i = 0; i < nwords; i = i + 1)
	{
		printf("%s\n", words[i]);
	}

	destroy_char_pp(words, nwords);

	return 0;
}

http://ideone.com/WUa0kN

0

Widzę że zabrałem się do tego od złej strony i dość skomlikowałem zadanie.
Dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1