Autor Thema: strcmp  (Gelesen 5328 mal)

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« am: 19. August 2012, 19:09 »
Hallo,
ich versuche eine strcmp Funktion zu schreiben:
int strcmp(const char * str_1 , const char * str_2)
{
if(strlen(str_1) > strlen(str_2))
{
return strlen(str_1) - strlen(str_2);
}
else if(strlen(str_1) < strlen(str_2))
{
return strlen(str_1) - strlen(str_2);
}
else
{
int ret = 0;
int i;

for( i = 0; str_1[i] != '\0' && str_2[i] != '\0'; i++ );
{
ret = ret + str_1[i] - str_2[i];
}
return ret;
}
}

Die Funktion funktioniert auch teilweise, sie hat aber Probleme damit zwei gleich lange Strings zu vergleichen. Ich glaube das Problem ist in der for-Schleife, ich weiß aber nicht genau was nicht stimmt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 19. August 2012, 19:34 »
Prüfst du nicht nur, ob die Strings "im Durchschnitt" gleich sind?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 19. August 2012, 19:44 »
Zuerst prüfe ich, ob die Strings unterschiedlich lang sind, wenn ja, dann gebe ich den Längenunterschied zurück, wenn sie gleich lang sind vergleiche ich die einzelnen Buchstaben mit einander, wenn die Strings gleich sind sollte hier 0 zurückgegeben werden.

Bsp 1:
hi wird mit ho verglichen.
0 = 0 + 104 - 104 = 0
0 = 0 + 105 - 111 = -6
Die Strings sind ungleich.

Bsp 2:
hi wird mit hi verglichen.
0 = 0 + 104 - 104 = 0
0 = 0 + 105 - 105 = 0
Die Strings sind gleich.

Ich weiß jedoch nicht ob es mir mit dem Code gelungen ist das so umzusetzen und ob es überhaut sinnvoll ist es so zu lösen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. August 2012, 20:01 »
Vergleiche mal "ab" mit "ba" mit deiner Methode.

Außerdem kriegst du so nur gleich oder ungleich raus, ein ordentliches strcmp sagt bei unterschiedlichen Strings auch noch, welcher "kleiner" und welcher "größer" ist.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. August 2012, 21:59 »
Zuerst prüfe ich, ob die Strings unterschiedlich lang sind, wenn ja, dann gebe ich den Längenunterschied zurück
Das ist eher weniger sinnvoll (bzw. wäre eine Erweiterung von strcmp()), solange du nicht unterscheiden kannst, ob du nun einen Längenunterschied (für unterschiedlich lange Strings) oder ein anderes Unterschiedlichkeitsmaß (für gleich lange Strings) bekommen hast.

Außerdem durchläuft dein strcmp() jeden String zweimal. Einmal oder weniger reicht auch aus.

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. August 2012, 16:09 »
So, ich habe jetzt eine Lösung gefunden, die bei mir Funktionier:
int strcmp(const char * str_1 , const char * str_2)
{
int i;
int ret = 0;
for(i = 0; str_1[i] != '\0' && str_2[i] != '\0' ; i++)
{
if(str_1[i] > str_2[i])
{
ret = 1;
}
else if(str_1[i] < str_2[i])
{
ret = -1;
}
}
return ret;
}

Wenn jemand noch Fehler findet, oder etwas zu verbessern weiß, kann er sich ja melden.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 20. August 2012, 16:26 »
In westeuropäischen Sprachen ist es üblicher, nach dem ersten Buchstaben des Worts statt nach dem letzten alphabetisch zu sortieren. (Und bei unterschiedlichen Längen geht es sowieso total in die Hose)

Ich würde dir empfehlen, dir mal eine ordentliche Anzahl von Testfällen zuzulegen, mit denen du selbst schauen kannst, ob noch was kaputt ist.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen