Sortowanie alfabetyczne malejąco

0

Mam problem z sortowaniem alfabetycznym malejąco pojedynczych znaków. Sortuje dobrze póki nie trafi na słowo, które zawiera dwie takie same litery. Zamieszczam kawałek kodu:

char*tabB[D] = { NULL };
char **tabC[D] = { NULL };
scanf("%s", napis);

	int ilosc = 0;
	for (i = 0; i < sizeof(napis); i++)
	{
		if (napis[i] == NULL)
		{
			break;
		}
		ilosc++;
	}

	int j = 0;
	for (i = 0; i<ilosc; i++)
	{
		
			tabC[j] = &tabB[i]; 
			j++;
		
	}
	for (i = 0; i<j; i++)
	{
		printf("%c", **tabC[i]);
	}
	int min;
	char bufor;
	for (int i = 0; i<j - 1; i++)
	{
		min = i;
		for (int k = i + 1; k<j; k++)
		{
			if (**tabC[k]>**tabC[min])
				min = k;
		}
		bufor = **tabC[min];
		**tabC[min] = **tabC[i];
		**tabC[i] = bufor;

	}

	for (i = 0; i<j; i++)
	{
		printf("%c", **tabC[i]);
	}
0

Łatwiej będzie Ci użyć (strcmp)(https://pl.wikibooks.org/wiki/C/strcmp) do porównania dwóch stringów.

Poza tym wrzuć kod który da się skompilować, z tego co wrzuciłeś nie można wywnioskować co to jest j i skąd się bierze.

0

Już uzupełniłam, próbowałam strcmp ale gorzej mi to szło. Poza tym mam tu jeden znak a do tego typ char a nie string

0

Ten kod ma sortować litery tylko jednego wyrazu wprowadzonego przez użytkownika, tak?

0

Samą część sortującą prawie już miałaś, choć ten if:

if (**tabC[k]>**tabC[min]) { ... }

powinien wyglądać tak:

if (**tabC[k] < **tabC[min]) { ... }

Twój kod jest niepotrzebnie skomplikowany, wydaję mi się że nie ma sensu go poprawiać więc prezentuję moją propozycję:

#define SIZE 100 // Maksymalna długość wyrazu - 1 (ostatni znak musi być \0)

void read_and_sort(void)
{
	// Stwórz bufor na słowo które poda użytkownik
	char napis[SIZE];

	// Pobierz słowo od użytkownika
	// Dzięki fgets mamy pewność że słowo nie przepełni bufora
	fgets(napis, SIZE, stdin);

	napis[strcspn(napis, "\n")] = '\0'; // Zamień wszystkie znaki \n na \0

	const int length = strlen(napis); // Długość napisu

	// Sortowanie
	for (int i = 0; i < length - 1; i++)
	{
		int min = i;
		for (int j = i + 1; j < length; j++)
		{
			if (napis[j] < napis[min])
				min = j;
		}

		// Zamiana liter
		char tmp = napis[min];
		napis[min] = napis[i];
		napis[i] = tmp;
	}

	// Wyświetlenie posortowanego napisu
	printf("%s", napis);
}
0

dzięki za odpowiedz i poświęcony czas.
jeśli chodzi o ten if to miało to być uporządkowane w sposób malejący i to robi dobrze poza tym własnie tylko jeśli pojawia sie w słowie dwie takie same litery. Mój program jest bardziej złożony niz w tym kawałku co wrzuciłam, ale uważam, że bez sensu wrzucać tutaj cały kod jak w niektórzych elementach o co innego chodzi. Poza tym miałam intensywnie tutaj wykorzystac wskazniki do wskaznikow i mysle ze tutaj w sortowaniu moze pojawiac sie problem. Jesli chodzi o zwykłe sortowanie to bym sobie poradziła

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