Porównywanie napisów C.

0

Mam jakiś tekst i chcę porównać ze sobą pierwszy i drugi napis, gdy pierwszy jest bliżej alfabetu funkcja ma zwrócić 1.W tablicy litery[] mam wszystkie znaki włącznie z polskimi. Nie wiem w czym problem, ale wydaje mi się, że wartości por1 i por2 się nie iterują i funkcja zawsze zwraca 0. ps. na razie zakładam, że napisy są równej długości.

int porownanie1(char **dd, int jeden, int dwa, char *litery) 
{
	int len1,len2, por1 = 0, por2 = 0, licznik, i;
	len1 = strlen(dd[jeden]);
	len2 = strlen(dd[dwa]);
	for (licznik = 0; licznik < len1; licznik++)
	{
		for (i = 0; i <= 70; i++)
		{
			if (dd[jeden][licznik] != litery[i]) por1++;
			if (dd[dwa][licznik] != litery[i]) por2++;
		}
		if (por1 != por2) break;
		por1 = 0;
		por2 = 0;
	}
	if (por1 < por2) return 1;
	else return 0;
}
0

Co to znaczy, że napis jest bliżej alfabetu?
I w jedno bajtowych komórkach pamięci masz polskie znaki?

0

Sorry, bliżej alfabetu nie wiem jak się wyrazić, ale np: dwa słowa : ala,kot ma zwrócić 1 a: kot, ala zwrócić 2.

0

kot, ala zwrócić 0 *

0

Nie wiem w ilu bajtowych komórkach trzymam polskie znaki :/, ale jeżeli porównuje słowa bez polskich znaków to tak czy siak funkcja powinna dobrze zwracać (możliwe, że się mylę)

0

Jeśli w char* litery masz wszystkie litery, alfabetu, to ta pętla zawsze znajdzie literę, dla każdej litery w wyrazie i zawsze por1 i por2 będą równe długości liter w wyrazie, lecz polskie znaki są zbudowane z większej ilości, to mogą być podwójnie liczone.

0

por1 i por2 zawsze są równe 70... Ale skoro wpisuje : ala kot. Wówczas pętla powinna się zerwać ponieważ por1 != por2, dzieje się tak gdy wpiszę zamiast

dd[jeden][licznik] != litery[i]) por1++;
dd[jeden][licznik] != 'a' ) por1++;

więc problem musi być z tą tablicą, ale nie mogę znaleźć rozwiązania.

0

Ponadto właśnie sprawdziłem:

dd[jeden][licznik] != 'ą' ) por1++;

i działa...

0
char litery[70] = {
		'A','a','Ą','ą','B','b','C','c','Ć','ć','D','d','Ę','ę','E','e','F','f','G','g','H','h','I','i',
		'J','j','K','k','L','l','Ł','ł','M','m','N','n','Ń','ń','O','o','Ó','ó','P','p','Q','q','R','r',
		'S','s','Ś','ś','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','Ź','ź','Ż','ż' };

Tablica wygląda tak jeżeli komuś ma się przydać.

0

Bliżej alfabetu takie coś nie istnieje:

 for (i = 0; i <= 70; i++)
        {
            if (dd[jeden][licznik] != litery[i]) por1++;
            if (dd[dwa][licznik] != litery[i]) por2++;
        }

w litery masz cały alfabet i iterujesz cały alfabet czyli na 100% znajdziesz literę z wyrazu w alfabecie bo wyraz jest polski.
Czyli por1 będzie zawsze równy wielkości licznik * (ilość liter w alfabecie - 1) gdyż jedna zawsze się zgadza
I tak samo por2 będzie liczony jak por1.

0

Chyba działa, popraw mnie jeżeli nie :)

for (licznik = 0; licznik < len1; licznik++)
	{
		for (i = 0; i <= 70; i++)
		{
			if (dd[jeden][licznik] != litery[i]) por1++;
			if (dd[dwa][licznik] != litery[i]) por2++;
			if (por1 != por2) break;
		}
		if (por1 != por2) break;
		por1 = 0;
		por2 = 0;
	}
0

Jeżeli podasz dwa idealnie takie same wyrazy to program będzie próbował dostać się do 71 obiektu tablicy (index - 70) a twoja tablica ma tylko 70 obiektów (znaków).

Tak jak napisał kolega J0ras

w takim razie ta pętla powinna być taka: for (i = 0; i < 70; i++)

0

a) przepisz znaki do drugiego stringa lub char*a uzyskanego mallociem. Nie zwracaj uwagi na wielkość liter. Funkcja przepisująca znaki od 1 do @ przepisuje je kopiujac. Funkcja przepisująca dalelsze znaki A..Z i polskie umieszcza na dalszych pozycjach niezależnie od wielkości. A i a laduje jako znak 65, A i ą jako znak 66, B i b jako znak 67 itd. Później za nimi umieszczasz dalsze znaki ASCII (które normalnie występują po literze z). stringów nie musisz kończyć zerem, mallocowane char* kończysz zerem.
Tak przepisane ciągi porównujesz zwykłym strcmp. Zwraca -1, gdy mniejsze, 1 gdy większe i 0 gdy równe (bardziej praktyczne niż 2 wyniki funkcji).
Po porównaniu przed returnem robisz free jeżeli użyłeś char*.

Kod zostawiam Tobie.

0

Jest jeszcze strcoll, który chyba robi to co chcesz uzyskać. Przeczytaj pomoc do tej funkcji, czy Ci odpowiada i czy na prawdę trzeba koło wynajdować od nowa.
Miało być znaki od \x01 do @. Nie od 1, rozumianej jako cyfrę.
Do ułożenia alfabetycznego znaków możesz wykorzystać tablicę 256-elementową. Będzie to wydajniejsze niż spaghetti typu switch...case lub seria ifów.

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