also hab mal zwei strings mit irgendeiner zeichenkette gefüllt, aber will das ohne die funktion strcmp() machen. hätte jemand ne idee?
String vegleichen
-
-
-
Hallo,
tja warum nicht strcmp? Gibt es da wirklich einen Vernünftigen Grund dagegen? Was hast du überhaupt vor?Gut es gibt für Stringvergleiche etc. auch noch diese andere "Standartfunktionsbibliothek",suche mal bei google oder in der MSN nach "Regular Expression", viel Spass damit
Peter
-
Ich dumme Kuh. Frohes neues Jahr wünsche ich euch allen!!!
das mit den expressions werd ich mir mal anschauen.also hab das jetzt mal so gemacht. das einzigste problem liegt noch bei der rückgabe von return 0 in dem else block, weil wenn ich den ersten buchstabe vergleiche mit dem ersten buchstabe aus dem anderen string dann muss er ja auch noch den zweiten mit dem zweiten buchstaben vegleichen bis zum ende der beiden wörter um herauszufinden welches wort alphabetisch vor dem anderen steht oder ob sie komplett übereinstimmen.
C
Alles anzeigen#include <conio.h> #include <iostream.h> #include <stdlib.h> int compareStr(char *str1, char *str2) { char *pString1; char *pString2; if(*str1 > *str2) return (1); else if(*str1 < *str2) return (-1); else { return (0); } } void main(void) { const int elemente = 20; char string1[elemente]; char string2[elemente]; int returnwert; cout << "\t\tProgramm zur alphabetischen Anordnung" << endl; cout << "\t\t-------------------------------------" << endl; cout << endl << endl << endl; cout << "Bitte erste Zeichenkette eingeben!" << endl; cout << "Eingabe(max. 20 Zeichen): "; cin.getline(string1, elemente); cout << "Bitte zweite Zeichenkette eingeben!" << endl; cout << "Eingabe(max. 20 Zeichen): "; cin.getline(string2, elemente); cout << endl; cout << "Info:" << endl; cout << "-----" << endl; cout << "gespeichert in string1 " << string1 << endl; cout << "gespeichert in string2 " << string2 << endl; cout << endl; cout << "Uebergabe an die Funktion compareStr" << endl; returnwert = compareStr(string1, string2); cout << endl << endl; cout << "Ergebnis:" << endl; cout << "---------" << endl; switch(returnwert) { case (1): { cout << endl; cout << "Returnwert ist 1" << endl; cout << "String1 vor String2" << endl; cout << "Zeichenkette " << string1 << " kommt vor " << string2 << "." << endl; break; } case (0): { cout << endl; cout << "Returnwert ist 0" << endl; cout << "Zeichenketten sind alphabetisch gleich." << endl; break; } case (-1): { cout << endl; cout << "Returnwert ist -1" << endl; cout << "String2 vor String1" << endl; cout << "Zeichenkette " << string2 << " kommt vor " << string1 << "." << endl; break; } default: { cout << endl; cout << "Fehler beim Rueckgabewert!" << endl; cout << "Funktion ueberpruefen." << endl; break; } } getch(); }
-
Hallo Goldie,
damit nicht nur die jeweils ersten Zeichen betrachtet werden, müssen die Zeichenketten in einer Schleife Zeichen für Zeichen verglichen werden. Wenn sich in einem Schleifendurchlauf die Zeichen unterscheiden kann die Funktion mit dem entsprechenden return-Wert verlassen werden. Wenn die Zeichen gleich sind werden die nächsten verglichen. Das ganze so lange, bis mindestens eine Zeichenkette zu Ende ist.
Vor dem Vergleichen könnte man die Zeichen noch in Kleinbuchstaben wandeln, so dass die Schreibweise keine Rolle spielt.
In der switch-case ist noch die Zuordnung vertauscht.Das ganze könnte so aussehen:
C
Alles anzeigen#include <conio.h> #include <iostream.h> #include <stdlib.h> int compareStr(char *str1, char *str2) { int i; char cZeichen1,cZeichen2; for(i=0;str1[i]!='\0' || str2[i]!='\0';i++) { //to lower-case if(str1[i]<91)cZeichen1=str1[i]+32; else cZeichen1=str1[i]; if(str2[i]<91)cZeichen2=str2[i]+32; else cZeichen2=str2[i]; //vergleichen if(cZeichen1 > cZeichen2) return (1); else if(cZeichen1 < cZeichen2) return (-1); } if(str1[i]=='\0') { if(str2[i]=='\0')return (0);//beide zu Ende else return (-1);//str1 zu Ende } else return (1);//str2 zu Ende } void main(void) { const int elemente = 20; char string1[elemente]; char string2[elemente]; int returnwert; cout << "\t\tProgramm zur alphabetischen Anordnung" << endl; cout << "\t\t-------------------------------------" << endl; cout << endl << endl << endl; cout << "Bitte erste Zeichenkette eingeben!" << endl; cout << "Eingabe(max. 20 Zeichen): "; cin.getline(string1, elemente); cout << "Bitte zweite Zeichenkette eingeben!" << endl; cout << "Eingabe(max. 20 Zeichen): "; cin.getline(string2, elemente); cout << endl; cout << "Info:" << endl; cout << "-----" << endl; cout << "gespeichert in string1 " << string1 << endl; cout << "gespeichert in string2 " << string2 << endl; cout << endl; cout << "Uebergabe an die Funktion compareStr" << endl; returnwert = compareStr(string1, string2); cout << endl << endl; cout << "Ergebnis:" << endl; cout << "---------" << endl; switch(returnwert) { case (1): { cout << endl; cout << "Returnwert ist 1" << endl; cout << "String2 vor String1" << endl; cout << "Zeichenkette " << string2 << " kommt vor " << string1 << "." << endl; break; } case (0): { cout << endl; cout << "Returnwert ist 0" << endl; cout << "Zeichenketten sind alphabetisch gleich." << endl; break; } case (-1): { cout << endl; cout << "Returnwert ist -1" << endl; cout << "String1 vor String2" << endl; cout << "Zeichenkette " << string1 << " kommt vor " << string2 << "." << endl; break; } default: { cout << endl; cout << "Fehler beim Rueckgabewert!" << endl; cout << "Funktion ueberpruefen." << endl; break; } } getch(); }
hoffe das hilft dir
-
danke jamo für deine hilfe, hab da jetzt noch was dazu geschrieben mit dem umwandeln von umlauten damit die auch richtig sortiert werden. es geht alles. was ich halt nicht verstehe warum wird das ß und ss erst nach dem umwandeln in kleinbuchstaben richtig behandelt, sowie es auch im duden steht das z.b. Straße als erstes kommt und dann Strasse. wenn iich die umwandlung draußen lass ist es genau umgekehrt. dann wollt ich noch fragen ob man die suche und umwandlung der umlaute auch einfacher gestalten kann? gibt es vielleicht noch was, was ich umschreiben oder verkürzen könnte?
hier der code:
C
Alles anzeigen#include <conio.h> #include <iostream.h> #include <stdlib.h> #include <dos.h> int compareStr(char *str1, char *str2) { int i = 0; char cZeichen1; char cZeichen2; /*Kleinbuchstabe kommt vor Grossbuchstabe*/ if(str1[i] > 96 && str2[i] < 96) return (-1); else if(str2[i] > 96 && str1[i] < 96) return (1); /*Grossbuchstaben umwandeln in Kleinbuchstaben, Umlaute in Vokale wandeln, Vergleich der Buchstaben*/ for(i = 0; str1[i] != '\0' || str2[i] != '\0'; i++) { /*Grossbuchstaben umwandeln in Kleinbuchstaben*/ if(str1[i] < 91) cZeichen1 = str1[i] + 32; else cZeichen1 = str1[i]; if(str2[i] < 91) cZeichen2 = str2[i] + 32; else cZeichen2 = str2[i]; /*Umlaute in Vokale wandeln*/ if(str1[i] > 122) { if(str1[i] == 'ä') str1[1] = 'a'; else if(str1[i] == 'ö') str1[i] = 'o'; else if(str1[i] == 'ü') str1[i] = 'u'; } /*Umwandlung der Umlaute in Vokale von String 2*/ else if(str2[i] > 122) { if(str2[i] == 'ä') str2[i] = 'a'; else if(str2[i] == 'ö') str2[i] = 'o'; else if(str2[i] == 'ü') str2[i] = 'u'; } /*Vergleich der Buchstaben*/ if(cZeichen1 > cZeichen2) return (1); else if(cZeichen1 < cZeichen2) return (-1); } /*Buchstaben sind alle gleich, ermitteln der Zeichenkettenlänge*/ if(str1[i] == '\0') { /*Beide Zeichenketten sind zu Ende*/ if(str2[i] == '\0') return (0); /*Nur Zeichenkette String 1 ist zu Ende*/ else return (-1); } /*Nur Zeichenkette String 2 ist zu Ende*/ else return (1); } void main(void) { const int elemente = 20; char string1[elemente]; char string2[elemente]; char *pString1; char *pString2; int returnwert; /*Programmvostellung und Eingabe des String 1 und String 2*/ cout << endl << endl << endl << endl; cout << "\t\t Programm zur alphabetischen Anordnung" << endl; cout << "\t\t -------------------------------------" << endl; sleep(2); clrscr(); /*Programm zum Testen der Funktion*/ cout << "Tests wrden gestartet." << endl; cout << endl << endl; cout << "Testschritte:" << endl; cout << endl; cout << "1. Gleiche Zeichenketten vegleichen" << endl; cout << "-----------------------------------" << endl; cout << "String 1 = Hallo Welt" << endl; cout << "String 2 = Hallo Welt" << endl; pString1 = "Hallo Welt"; pString2 = "Hallo Welt"; strcpy(string1, pString1); strcpy(string2, pString2); cout << endl; returnwert = compareStr(string1, string2); if(returnwert == (1)) cout << string2 << ", " << string1; else if(returnwert == (0)) cout << "String 1 ist String 2"; else if(returnwert == (-1)) cout << string1 << ", " << string2; cout << endl << endl; cout << "2. Grossbuchstaben und Kleinbuchstaben vergleichen" << endl; cout << "--------------------------------------------------" << endl; cout << "String 1 = Härlein" << endl; cout << "String 2 = harken" << endl; pString1 = "Härlein"; pString2 = "harken"; strcpy(string1, pString1); strcpy(string2, pString2); cout << endl; returnwert = compareStr(string1, string2); if(returnwert == (1)) cout << string2 << ", " << string1; else if(returnwert == (0)) cout << "String 1 ist String 2"; else if(returnwert == (-1)) cout << string1 << ", " << string2; cout << endl << endl; cout << "3. Umlaute vergleichen" << endl; cout << "----------------------" << endl; cout << "String 1 = Maße" << endl; cout << "String 2 = Mäßchen" << endl; pString1 = "Maße"; pString2 = "Mäßchen"; strcpy(string1, pString1); strcpy(string2, pString2); cout << endl; returnwert = compareStr(string1, string2); if(returnwert == (1)) cout << string2 << ", " << string1; else if(returnwert == (0)) cout << "String 1 ist String 2"; else if(returnwert == (-1)) cout << string1 << ", " << string2; cout << endl << endl; cout << "4. S Laute vergleichen" << endl; cout << "----------------------" << endl; cout << "String 1 = Masse" << endl; cout << "String 2 = Maße" << endl; pString1 = "Masse"; pString2 = "Maße"; strcpy(string1, pString1); strcpy(string2, pString2); cout << endl; returnwert = compareStr(string1, string2); if(returnwert == (1)) cout << string2 << ", " << string1; else if(returnwert == (0)) cout << "String 1 ist String 2"; else if(returnwert == (-1)) cout << string1 << ", " << string2; cout << endl << endl; cout << "5. Laenge der Woerter vergleichen" << endl; cout << "---------------------------------" << endl; cout << "String 1 = Goethe" << endl; cout << "String 2 = Goes" << endl; cout << endl; pString1 = "Goethe"; pString2 = "Goes"; strcpy(string1, pString1); strcpy(string2, pString2); returnwert = compareStr(string1, string2); if(returnwert == (1)) cout << string2 << ", " << string1; else if(returnwert == (0)) cout << "String 1 ist String 2"; else if(returnwert == (-1)) cout << string1 << ", " << string2; cout << endl << endl; cout << "Weiter mit beliebiger Taste" << endl; getch(); clrscr(); /*Programm mit Benutzeraufforderungen*/ cout << "Programm wird gestartet." << endl; cout << endl << endl; cout << "Zeichenketten alphabetisch ordnen:" << endl; cout << endl; cout << "Bitte erste Zeichenkette eingeben!" << endl; cout << "Eingabe(max. 20 Zeichen): "; cin.getline(string1, elemente); cout << endl; cout << "Bitte zweite Zeichenkette eingeben!" << endl; cout << "Eingabe(max. 20 Zeichen): "; cin.getline(string2, elemente); cout << endl; /*Funktionsaufruf der Funktion compareStr()*/ returnwert = compareStr(string1, string2); /*Überprüfung des Rückgabewertes*/ switch(returnwert) { /*String 2 vor String 1*/ case (1): { cout << "Ergebnis des Vergleiches" << endl; cout << "------------------------" << endl; cout << endl; cout << "- Returnwert ist 1" << endl; cout << "Reihenfolge:" << endl; cout << string2 << endl; cout << string1 << endl; break; } /*String 1 gleich String 2*/ case (0): { cout << "Ergebnis des Vergleiches" << endl; cout << "------------------------" << endl; cout << endl; cout << "- Returnwert ist 0" << endl; cout << "Reihenfolge:" << endl; cout << "String 1 ist String 2" << endl; break; } /*String 1 vor String 2*/ case (-1): { cout << "Ergebnis des Vergleiches" << endl; cout << "------------------------" << endl; cout << "- Returnwert ist -1" << endl; cout << "Reihenfolge:" << endl; cout << string1 << endl; cout << string2 << endl; break; } /*Fehler des Rückgabewertes*/ default: { cout << "Ergebnis des Vergleiches" << endl; cout << "------------------------" << endl; cout << endl; cout << "- Returnwert ist falsch" << endl; cout << "- Funktion ueberpruefen" << endl; break; } } getch(); }
-
Guck dir mal ne ASCII Zeichentabelle an oder lass dir die Dezimalwerte der Zeichen ausgeben, dann siehst du genau was passiert.
Evtl muss die Wandlung der Groß/Klein-Schreibweise für die Umlaute gesondert betrachtet werden. -
hi zusammen,
hab gestern noch einen dummen, dummen fehler gefunden! in der funktion wird als erstes klein- und großschreibung unterschieden. der fehler is das, wenn ich " schlafmütze " mit "Dummerchen" vergleichen lass, er mir schlafmütze vor Dummerchen ausgeben würde.gruss goldie
-
hi zusammen,
hab nochmal ne frage zu string. angenommen ich hab im string1 eine Wort drinne stehen zum Beispiel "Maße", jetzt will ich aber das er mir, wenn ich diesen String mit einem anderen String vergleiche, das "ß" wie ss behandelt.
ich hab nach dem "ß" erstmal gesucht und dann gesagt er soll ein "ss" drauß wandeln. das geht ja auch nur leider überschreibt er mir dann den nächsten buchstaben also z.b. Mass anstatt Masse. Wie kann ich dem sagen das er den String um 1 feld erweitern soll damit er mir keinen anderen buchstaben überschreibt. oder würde es da noch ne andere möglichkeit geben?gruss goldie
-
Tja nach diesem ß suchen,alles was dahinter kommt abschneiden,
den letzten Buchstaben des Feldes auf s setzen,das letzte Feld+1 auch s und Feld+2 auf "\0" so,jetzt den abgeschnittenen Teil mit strcat wieder anhängen.Klappt ntürlich nur in eine Richtung,aus ß ein ss machen geht noch,
aber anders herum geht nicht wegen der Rechtschreibung.Peter
-
Warum ist an dieser Stelle im Programm:
if(str1[i]<91)cZeichen1=str1[i]+32;
else cZeichen1=str1[i];
if(str2[i]<91)cZeichen2=str2[i]+32;
else cZeichen2=str2[i];gerade die 91 und die 32 definiert?? Was sollen die denn genau bewirken und wieso gerade solche "krumme" Zahlen?!?
-
Hallo,
sieh dir mal DIESE SEITE
an,alles was dezimal kleiner als 91 und größer als 64 ist sind GROSSBUCHSTABEN durch eine Addition mit der Zahl 32 werden diese in kleinbuchstaben umgewandelt...Peter
-
du kannst das so programmieren das du die dezimalzahlen beachtest (dank an jamo). aber wenn du das ganze in java versuchst zu programmieren dann haut er dir das ganze ding um die ohren. eine weitere lösung wäre:
danke für deinen hinweis aber das muss irgendwie einfacher gehen, hab das mal im netz gesehen weiss aber net mehr wo. muss ich mir noch etwas kopfschmerzen bereiten.
-
Hallo,
zu 2:
die meisten Suchfunktionen geben einen Zeiger auf den Rest des feldes zurück also sind das höchstens 2-3 Zeilen.zu 1. Ich will jetzt,besonders die "Anfänger" auch auf folgendes hinweisen:
wenn ihr mit Visual C++ ein neues Projekt erstellt sieht das so aus:
int _tmain(int argc, _TCHAR* argv[])
{
}
das entscheidene ist dieses _tmain und _TCHAR,für reine "DOS-Übungsaufgaben" wie hier könnt ihr weiterhin main und char[] verwenden,
allerdings bei Windows und WIN32-Consolen Programmen solltet ihr die TChar Funktionen oder gleich die von Windows verwenden
wchar_t z.B. anstelle von char verwenden da ab Windows2000 alle Programm UNICODE fähig sein sollten.Dies nur als Hinweis wenn jemand die Beispiel hier mit Editboxen, Buttons in einem Windowsdialog versucht....
(Auch so was einfaches wie GROSS in klein sollte man da besser mit entsprechenden Makros/Funktionen machen....Peter
-
Hi nochma!
Wenn man in diesem Code ein ä und ein ü eingibt, dann soll ja eigentlich das ä zu a und ü zu u werden! Das heisst das ä(a) müsste vor dem ü(u) stehen! Dies wird aber nicht so ausgegeben...sondern "ü kommt vor ä"! Wo liegt denn da noch n Fehler?!?P.S.: Bei den Grossbuchstaben klappt das! Also "Ä kommt vor Ü"!
-
Hallo,
weiß denn niemand eine Lösung zu dem Problem mit ä und ü?
Vielen Dank im voraus.
-
hi ihr,
also du solltest das wort schritt für schritt vollständig mit deinen kriterien bearbeiten das heißt,
1. kleinbuchstaben wandeln
2. umlaute wandeln
3. nach dem "ß" schauen
4. Strings vergleichenwenn schritt 4 keinen returnwert zurückgegeben hat dann musst du halt die länge des strings vergleichen.
das mit dem "ß" machst du am besten mit einem 2 String (tipp von lastwebpagedanke). und dann musst du
halt schauen wenn die wörter gleich sind, denn dann musst du noch einbauen das ß vor ss kommen soll, dass
machst du am besten mit ner normalen variable und überprüfst dann den wert.PS: Immernoch Gießen!
-
Hallo
kannst du das bitte mal im Code ändern? Habe schon alles versucht, bekomme es nicht hin.
Vielen Dank im voraus.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!