Sortowanie tablicy stringów w C


(Darkvifon) #1

Witam.

Chciałbym posortować tablicę stringów (właściwie to tablic znakowych), ale nie za bardzo mi to wychodzi. Czy ktoś mógłby rzucić okiem na ten programik testowy? Głównym problemem zapewne jest funkcja sortująca. Nie jestem pewien co ja mam właściwie do niej przekazać (wiem, że wskaźnik, ale nie wiem do końca do czego).


([alex]) #2

Ten program sortuje tablice C napisów.

Przekazujesz do niej typ char **

czyli wskaźnik na wskaźnik na char


(Darkvifon) #3

Kłopot w tym, że cały czas mi się wydaje, że właśnie to robię. Mógłbyś przerobić mój kod, tak aby działał, żebym mógł zobaczyć gdzie robię błąd? Byłbym naprawdę wdzięczny.


(Sawyer47) #4

Można tak:

void sort(char string[][64], int n);

Ale raczej nie o to Ci chodzi. Ew zmień string na tablicę wskaźników char *strs[ARR]; i przydzielaj dynamicznie – wtedy twój kod sort zadziała.


(Darkvifon) #5

A mógłbyś napisać to trochę jaśniej? Jestem jeszcze stosunkowo początkujący, a do tego jestem wykończony problemami z programem (ten to tylko jeden z wielu problemów, a wszystko ma być gotowe na środę) i mam już drobne kłopoty z logicznym myśleniem.

Dodam, że docelowo chcę sortować tablicę struktur według jednego z elementów struktury (stringu).


(Sawyer47) #6

O ile się nie mylę, to problem jest w tym:

char string[ARR][64];

	char **tmp = NULL;

	printf("%lu != %lu\n", sizeof string[0], sizeof *tmp);

Wywołując funkcję chcesz rzutować char (*)[64] - wskaźnik na 64-elementową tablicę char (64 bajty) na char**- wskaźnik na wskaźnik na char (u mnie 8 bajtów). Raczej musisz wybrać: albo pierwszy typ, albo drugi.

//edit Tu to tmp jest tylko do pokazania wielkości wartości wskazywanych przez char** czyli to jaki argument przyjmujesz w sort


(Darkvifon) #7

Szczerze mówiąc niewiele zrozumiałem, ale udało mi się zmusić funkcję do działania. Teraz wygląda to tak. Co ciekawe, teraz jak patrzę na Twój poprzedni post (przynajmniej na jego pierwszą część), to jest to dokładnie to, co zrobiłem. Nie wiem czemu od razu nie zrozumiałem tego posta, chyba zmęczenie+choroba.

Muszę to jeszcze "tylko" zmodyfikować tak, żeby sortowało tablicę struktur. Struktura wygląda mniej więcej tak:

struct struktura

{

	char str1[64];

	char str2[64];

	char str3[64];

	int nr;

}

Chciałbym, żeby moja funkcja mogła sortować tę tablicę wg ciągów str1, str2 lub str3 (zależnie od przekazanych parametrów). Niestety tutaj znowu kończy się moja wiedza. Czy ktoś może mi pomóc? Najlepiej tak "od podstaw" jak to możliwe. Poza tym, bardzo dziękuję za dotychczasowe rady, może nie wszystkie od razu zrozumiałem, ale się przydały. EDIT: Zrobiłem coś takiego, ale nie działa:

void sort(struktura stru[64], int n)

{

	int i, j;

	struktura tmp;

	int change = 1;


	for (i=0; i
	{

		change = 0;

		for (j=0; j < n-1-i; ++j)

		{

			if (strcmp(stru[j+1].str1, stru[j].str1) < 0)

			{

				tmp = stru[j];

				stru[j] = stru[j+1];

				stru[j+1] = tmp;

				change = 1;

			}

		}

	}

}

Uwagi: Strukturę zdefiniowałem wcześniej typedefem. Poza tym, na razie nawet nie próbowałem robić wyboru pola wg którego funkcja sortuje.

EDIT2:

A jednak powyższa funkcja jest dobra. Przeanalizowałem ją na spokojnie i stwierdziłem, że ona MUSI działać. Po paru testach okazało się, że rzeczywiście problem był w innej części programu. Jeszcze raz dziękuję wszystkim za naprowadzenie na prawidłowe rozwiązanie.