porównanie stringów CString

0

Hi
kiedy robie sobie taki kodzik, to w zależności czy w konstrukcji

if
dam

czy

<
to kompilator albo zawsze wchodzi mi do if, albo nigdy. I nie maja znaczenia tutaj podane przyklady, albo wchodzi albo nie wejdzie ani razu. Dlaczego??
aha z metodą Compare jest tak samo. Myslalem ze moze lepiej uzyc funkcji do porownywania char strcmp( ) albo samem mu napisac, ale mysle ze ja po prostu mam jakis blad tutaj, ale ni cholery nie wiem o co bieda oi gdzie. ju zdostalem iiałej gorączki bo siedzę nad tym i nic nie widzę.

CString T[11];
T[0]="Jaro";
T[1]="Kowalski";
T[2]="Krasicki";
T[3]="MMMM";
T[4]="bleble";
T[5]="Nowak";
T[6]="asda";
T[7]="f";
T[8]="";
T[9]="";
int i=0;
CString naz;
for(i=1;i<10;i++)
{
naz.Format("%d", i);
if(T[i].Compare(T[0])>0) //lub if(T[i]>T[0])
{
MessageBox(""+naz,"");
//jakis kod w if, albo zawsze wejdzie albo nigdy
}
}

0

Na poczatku musisz wiedziec ze T[10] nie jest w Twoim kodzie zainicjowane. Zapomniales ?? :)
Niby NULL ale :(

Poza tym nie wiem czy ktokolwiek rozumie to co tu napisales :(

int i=0;
CString naz;
for(i=1;i0) //lub if(T[i]>T[0])
{
MessageBox(""+naz,"");
//jakis kod w if, albo zawsze wejdzie albo nigdy
}
}

Natomiast taki kod na pewno dziala !!

CString T[10];
T[0]="Jaro";
T[1]="Kowalski";
T[2]="Krasicki";
T[3]="MMMM";
T[4]="bleble";
T[5]="Nowak";
T[6]="asda";
T[7]="f";
T[8]="";
T[9]="";
for(i=0;i<10;i++)
if(T[i]>T[0])
MessageBox(NULL, T[i] ,MB_OK );

Zawsze wejdzie do fora i zawsze sprawdzi warunek w if !! I jesli T[i] jest "wieksze" T[0] to
zostanie wyswietlony MessageBox !!!! Nie ma mowy zeby cos sie krzaczylo !!

CString ma przeciazone operatory m. in. >, <, == wiec wszystko jest jak trza !!

0

Kurde ten powyzszy post to moja robota :( Heh te forum jest dziwne :(

Powinno byc tak :

Na poczatku musisz wiedziec ze T[10] nie jest w Twoim kodzie zainicjowane. Zapomniales ?? :)
Niby NULL ale :(

Natomiast taki kod na pewno dziala !!

CString T[10];
T[0]="Jaro";
T[1]="Kowalski";
T[2]="Krasicki";
T[3]="MMMM";
T[4]="bleble";
T[5]="Nowak";
T[6]="asda";
T[7]="f";
T[8]="";
T[9]="";
for int i jest = 0 dopoki i jest mniejsze od 10 krok to i++
if(T[i]>T[0])
MessageBox(NULL, T[i] ,MB_OK );

Zawsze wejdzie do fora i zawsze sprawdzi warunek w if !! I jesli T[i] jest "wieksze" T[0] to
zostanie wyswietlony MessageBox !!!! Nie ma mowy zeby cos sie krzaczylo !!

CString ma przeciazone operatory m. in. wiec wszystko jest jak trza !!

0

amdek : dzieki za poprawienie, zapomnialem o jeszcze jednym znaku co go przegladarka nie wyswietla.

Skoro mowisz ze dzialac powinni to porosze Cie sprawdz to i powiedz potem, bo powtazam jeszcze raz. U mnie MessageBox("","") wyswietla sie albo zawsze (bez znaczenia ma tutaj string w T[i] ), albo nigdy (rowniez nie zaleznie od T[i] ).
Dlaczego?????????????

Nie ma czegos takiego zeby przy stringach mniejszych sie nie wyswietlal, a przy wiekszych sie wyswietlal. On jakos nie rozroznia ich tych srtingow, i dziala jak miu sie podoba. Z funkcja Compare jest tak samo

0

Heh nie lubie jak ktos bezpodstawnie podwaza to co napisalem :-[
A ty to niestety zrobiles !!
Specjalnie dla ciebie napisalem progsa MFC, zaaplikowalem mu twoje
zmienne i niestety ale juz przed napisaniem tamtego posta wszystko dzialalo i dalej dziala !!!!
Zmien w moim kodzie na MessageBox ("","") a ujrzysz ze wszystko jest w najlepszym porzadku !!
Lepiej jakbys sie jednak przyjrzal dokladniej swojemu kodowi - wyszloby Ci na dobre !!!!

Moze nastepnym razem podasz wieksza czesc programu to bym znalazl TWOJ blad !!

PS. Ja staram sie nie pisac bzdur i zawsze wszystko jest sprawdzone w kazdym calu !!
Wiec troche RESPECT dla czyjejs pracy i wiedzy ??!!

0

dobra spoko, dzięki że sprawdziłeś.
nie zmienia to jednak faktu ze u mnie nie dziala jak powinno. To jest cały kod, nie ma reszty programu bo on nie jest w ogóle zwiazany z inna czescia kodu. Zrobilem to na potrzeby forum bo inna wersja tego tez nie dzialala.
Aha i z tym messagebox to nie ma znaczena bo sledzac t krok po kroku widze ze jak juz raz wejdzie do konstrukcji if to potem juz nie zaleznie od stringow zawsze wchodzi do ifa.
natomiast jak raz nie wejdzie to juz nigdy nie wejdzie. Cholera wiem ze tak nie powinno byc ale u mnie sie cos sypie i nawet nie mam pomysla jak to ominac. A musze posortowac te srtingi przeciez

0

Wydaje mi sie, ze problem tkwi w sposobie porównywania strongów.
Chcesz je posortować tylko według długości ?

0

Krukers: chodzi o sortowanie alfabetyczne. Znaki mniejszości to chyba porownanie stringow jesli chodzi o kolejnosc alfabetyczna, a jesli nawet nie to robilem to samo metoda Compare(). Ona to juz na pewno porownuje stringi jesli chodzi o kolejnosc alfabetyczna (a taka jest mi potrzebna), no i u mnie sie sypie to wlasnie.

0

Nie ma co szukac bledow w tym kodzie co napisales !!!! Bo ich tam nie ma !!!!

Ostro przedebugowalem wszystko linijka po linijce i wszystko sie wykonuje jak trza !!

Musisz miec w innym miejscu cos zepsute !!

Aha jeszcze pytanie dla pewnosci jaki kompilator i jezyk i aplikacja ??

0

cholera mysle ze to problem jakis z kompilatorem, ale kiedys przeciez chodzilo mi dobrze podobne kody.
Dla pewnosci czy nie mam gdzie indziej bledy napisalem taki programik w Win32Apllication w visual C++ 6.0

#include < string.h>
void main()
{

char T[20][20];
strcpy(T[0],"Jaro");
strcpy(T[1],"Kowalski");
strcpy(T[2],"Krasicki");
strcpy(T[3],"MMMM");
strcpy(T[4],"bleble");
strcpy(T[5],"Nowak");
strcpy(T[6],"asda");
strcpy(T[7],"f");
strcpy(T[8],"aaaaaaa");
strcpy(T[9],"zzzzzzzzzz");
int i=0;

int d=0;
int f=0;

for(i=1;i < 10;i++)
{
if(strcmp(T[i], T[0])>0)
{
f++;
}
}
}

i w tym przypadku z tymi danymi u mnie znienna f osiagnie wartosc 9 !!!
znaczy to ze wchodzi za kazdym razem do if
juz nie wiem jak inaczej moge posortowac te stringi, a samemu mi sie nie mam czasu pisac nowa funkcje porownujaca (bde chyba musial, ale czy to wystarczy?)

0

Do if’a wchodzi Ci zawsze, bo funkcja strcmp() zwraca 0 jeśli łańcuchy są równe. Zanim użyjesz jakiejś funkcji w if'ie najpierw zorientuj się jakie wartosci ona zwraca.
Nie wierze żeby w STL’u nie było czegoś, co sortuje stringi.
Poszukaj czegoś typu sort(), sort() itp…

0

Po pierwsze to to na pewno nie jest aplikacja win32Appication ale Win32 Console Application !!!! :)

Porownywanie jest jak najbardziej prawidlowe, tylko ten twoj algorytm porzadkowania jest zly :(
Najprostszym w implementacji jest cos podobnego do BubleSort i bedzie pasowal do twego kodu !!
Ofcoz jesli chcesz posortowac te lancuchy znakowe - bo z tego co napisales to znaczy ze chcesz :P !!

Jeszcze do twojego pytania sytuacja ze strcmp jest zupelnie inna :)
Otoz kody ASCII duzych liter sa mniejsze niz malych liter !!!! Wiec lancuch "aa" jest wiekszy od "Aa"!!
I dlatego nie dzialalo jak trzeba !!!!

[code]

#include <string.h>


int main(int argc, char* argv[])
{
	char T[20][20];
	strcpy(T[0],"Jaro");
	strcpy(T[1],"Kowalski");
	strcpy(T[2],"Krasicki");
	strcpy(T[3],"MMMM");
	strcpy(T[4],"bleble");
	strcpy(T[5],"Nowak");
	strcpy(T[6],"asda");
	strcpy(T[7],"f");
	strcpy(T[8],"aaaaaaa");
	strcpy(T[9],"zzzzzzzzzz");
	
	int iNewPos;
	char pPom[20];

	for(int j=0; j<9;j++) {
		iNewPos = j;
		for(int i=j+1;i < 10;i++)
			if(stricmp(T[i], T[iNewPos])<0) iNewPos=i;
		strcpy(pPom,T[j]);
		strcpy(T[j], T[iNewPos]);
		strcpy(T[iNewPos],pPom);	
	}

	for(int i=0; i< 10; i++) printf("%s\n",T[i]);
	return 0;
}

[/code]

Zastosowalem funkcje stricmp ktora nie zwraca uwagi na wielkosc liter i teraz jest wszystko sortowane
jak trzeba !!

0

Krukers: zauważ że tam nie było znaku mniejsze- równe tylko jest mniejsze. A to znaczy ze jesli strcmp() zwroci zero to i tak nie powinno wejsc. Aha jak dam znak na "większe" to do if nie wejdzie ani razu (f=0

oooo z tą stricmp() nie próbowałem zaraz lookne jak to u mnie pójdzie

tak to jednak chodzi o wielkie i male litery, teraz sprawdzilem ze wielkie sa wczesniej od małych w ASCII, dlatego "Jaro" był wczesniej od stringu "a", najlepiej korzystać z stricmp() albo zamienic na wielkie wszystko

0

Hehe no widzisz czasami dobrze poszukac i pownikac !! :)

Aga zerknijcie na moj kod C++ !! Chlopaki piszacy to forum czasami mnie zadziwiaja :) !! Ja tych buziek tam nie wstawilem :)

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