mit strcmp wird erster buchstabe verglichen wie der ganze string?
-
Hallo,
mit dem befehl strcmp wird ja nur der erste buchstabe der zwei strings miteinander verglichen, wie kann ich jetzt aber den ganzen string miteinander vergleichen.
-
Das hast Du falsch verstanden; strcmp vergleicht den ganzen string.
-
ich bin grad am üben auf eine Klausur. Wir haben eine Klausuraufgabe die lautet wie folgt:
Für eine Funktion finde Reihenfolge ist der C++-Code zu erstellen. Der Funktion werden zwei Zeiger auf Strings übergeben. Die Funktion prüft auf die lexikalische Reiehnfolge und gibt einen Ganzzahlwert zurück:
0: Gleichheit der beiden Buchstabenfolgen,
-1: der 1. übergebene String steht vor dem 2. String,
+1: der 2. übergebene String steht vor dem 1. Sting.Der Vergleich unterscheidet nicht zwischen Groß- und Kleinbuchstaben. Leerzeichen/Tabulator sind beim Vergleich zu ignorieren. Die ursprünglichen Strings sollen unverändert bleiben.
ich hab jetzt mal folgendes programmiert. Ist das total falsch oder korrekt oder was meint ihr?
#include <iostream> #include <string> using namespace std; int findeReihenfolge(char*, char*); int findeReihenfolge(char* z, char* y) { int test; test = strcmp(z,y); return test; }; int main() { char a[10]; char* zeigera = a; char b[10]; char* zeigerb = b; cout << "Bitte a eingeben" << endl; cin >> a; cout << "Bitte b eingeben" << endl; cin >> b; int ergebnis; ergebnis = findeReihenfolge(zeigera, zeigerb); cout << "das war a: " << endl; cout << a << endl; cout << "das war b: " << endl; cout << b << endl; cout << "das ergbnis vom Vergleich: " << endl; cout << ergebnis << endl; return 0; }
-
probier es doch einfach aus
"abc" sollte ja gleich "A\tB c" sein
Außerdem brauchst du nicht diese tmp-Variable anlegen return strcmp(z,y); würde reichen.
-
Die Aufgabe ist ein bisschen bescheuert, da eigentlich eine Signatur in der Art:
int compare_stringptrs_ci(string *p, string *q);
verlangt wird - was natürlich ziemlicher schwachfug ist. In richtigem C++ würde man wohl
int compare_strings_ci(string const &s1, string const &s2);
schreiben. Ich vermute aber, dass hier eher C-artiger Code gemeint ist, also
int compare_strings_ci(char const *s1, char const *s2);
In dem Fall sähe das wohl etwa so aus:
#include <ctype.h> /* In C++: #include <cctype> */ int compare_strings_ci(char const *s1, char const *s2) { int tmp_compare; while((tmp_compare = tolower(*s1) - tolower(*s2)) == 0 && *s1++ && *s2++) { while(*s1 == ' ' || *s1 == '\t') ++s1; while(*s2 == ' ' || *s2 == '\t') ++s2; } return tmp_compare; }
-
Wäre folgendes nicht besser
#include <ctype.h> /* In C++: #include <cctype> */ int compare_strings_ci(char const *s1, char const *s2) { int tmp_compare; while((tmp_compare = tolower(*s1) - tolower(*s2)) == 0 && *s1++ && *s2++) { while(isspace (*s1)) ++s1; while(isspace (*s2)) ++s2; } return tmp_compare; }
/Edit
Und wenn er auf eine Arbeit lernt verwirrt ihn doch nicht mit solche Kleinigkeiten wie Referenzen usw. davon hat er im Moment nichts
-
danke das ist doch mal was präzises. jetzt ist nur noch der fehler beim einlesen dass wenn ich z.b. "hallo a" eingebe dann durchläuft er das ganze programm automatisch und ich kann b nicht einlesen. Aber das kann ich ja durch getline beheben oder?
-
Das kann man mit getline beheben. Es ändert aber nichts daran, dass die Länge der Eingabe auf die Länge des buffers beschränkt ist, wenn du character arrays benutzt.
Ich würde an deiner Stelle strings benutzen; das sähe dann im Endeffekt so aus:
#include <cctype> #include <iostream> #include <string> using namespace std; int findeReihenfolge(string const &z, string const &y) { int tmp_compare; string::const_iterator s1 = z.begin(), s2 = y.begin(); while((tmp_compare = tolower(*s1) - tolower(*s2)) == 0 && s1++ != z.end() && s2++ != y.end()) { while((*s1 == ' ' || *s1 == '\t') && s1 != z.end()) ++s1; while((*s2 == ' ' || *s2 == '\t') && s2 != y.end()) ++s2; } return tmp_compare; } int main() { string a, b; cout << "Bitte a eingeben" << endl; getline(cin, a); cout << "Bitte b eingeben" << endl; getline(cin, b); int ergebnis; ergebnis = findeReihenfolge(a, b); cout << "das war a: " << endl; cout << a << endl; cout << "das war b: " << endl; cout << b << endl; cout << "das ergbnis vom Vergleich: " << endl; cout << ergebnis << endl; return 0; }
-
aber deiner findeReihenfolge-Funktion wird hier in deinem Beispiel keine Zeiger auf strings übergeben oder? das sind doch nur die Adressen von a und b oder?
-
Ich übergebe die Strings als konstante Referenzen. Das heißt, die Strings werden nicht durch den Kopierkonstruktor gejagt, was Rechenzeit spart, können aber in der Funktion auch nicht verändert werden.
Ich hab mich in dieser Implementierung nicht um den Wortlaut der Aufgabe gekümmert, ich wollte lediglich zeigen, wie man das sinnvollerweise in C++ anfangen würde.
-
ich habe jetzt
anstatt cin >> a und cin >> b
cin.getline(a) und cin.getline(b) eingegeben.
jetzt kommt aber folgende Fehlermeldung zweimal. Was ist denn falsch?
error C2661: 'getline' : no overloaded function takes 0 parameters
-
getline nimmt 2 parameter, nr 1 ist ein char* welches auf ein array der größe n zeigt, und der 2. parameter ist ein int, bei dem du die größe n des arrays angibst(oder weniger).
das sind dann die maximal zu lesenden bytes, wenn kein newline zeichen kommt.