Fehler in String Programm
-
Hallo,
das hier ist mein String Programm, welches
überprüfen soll ob 2 Strings gleich sind.
Einmal mit cstrings und einmal mit der Klasse String:#include <iostream> #include <string> using std::cout; using std::endl; using std::cin; using std::string; int main() { string option1("Hallo Welt!"); string option2("Hallo Welt!"); if (option1 == option2) cout << "Die Strings sind gleich!" << endl; // lib stil const char *coption1("Hallo Welt!"); const char *coption2("Hallo W2lt!"); int erg(0); for (int vergleich(0); vergleich != strlen(coption1)+1 && vergleich != strlen(coption2)+1; vergleich++) { if (*coption1 == *coption2) { coption1++; coption2++; erg = 5; } else { erg = 3; break; } } if (erg == 5) cout << "Beide Strings sind gleich!" << endl; if (erg == 3) cout << "Die Strings sind ungleich!" << endl; //cstring variante system("PAUSE"); return 0; }Warum gibt das Programm aus das die Strings gleich sind obwohl
sie das nicht sind? Wenn ich bei "Hallo Welt" nur bei Hallo
was ändere dann wird ausgegeben das es ungleich ist.
Aber nach dem Leerzeichen sagt es immer das die Strings gleich sind.
Obwohl sie das nicht sind.
Vielen Dank
FlashgottEDIT: Ja ich weiß das es eine Funktion gibt, um cstrings zu vergleichen.
Aber dieses mal brauche ich es so.
-
ah wollte noch Fragen warum man hier ein const davor setzten sollte
const char *coption1("Hallo Welt!"); const char *coption2("Hallo W2lt!");und nicht so
char *coption1("Hallo Welt!"); char *coption2("Hallo W2lt!");
-
Hi erstmal zu Deiner letzten Frage:
Flashgott schrieb:
ah wollte noch Fragen warum man hier ein const davor setzten sollte
const char *coption1("Hallo Welt!");und nicht so
char *coption1("Hallo Welt!");Dazu ganz schnell: Mit diesem Statement wird lediglich ein Pointer bereitgestellt, der auf einen Speicherbereich verweist, in dem "Hallo Welt" steht. Dieser Speicherbereich ist konstant (sprich: Der C++-Standard garantiert definiertes Verhalten nur, solange man den Inhalt dieses Speichers nicht verändert).
Als C-Altlast wird leider an dieser Stelle kein const gefordert (IIRC), aber es ist trotzdem hochgradig ratsam, das zu tun, um z.B. eine unbeabsichtigte Änderung zu hindern.Um Längen besser ist da schon Dein ursprünglicher Ansatz mit
Flashgott schrieb:
string option1("Hallo Welt!"); string option2("Hallo Welt!");Nun zu Deiner ersten:
WENN Du schon mit C-Strings arbeitest und str-Funktionen nutzt (wie strlen()) .... warum dann nicht auch strncmp() ?
(die strn..-Funktionen sind sowieso besser als die "ohne n").Gruß,
Simon2.
-
ich muss als Übung ein Programm schreiben,
das zuerst 2 Strings vergleicht
und dann 2 Strings im c stil - Jedoch nicht mit der Funktion strncmp.
Das Programm soll eine Schleife durchlaufen udn jeden Buchstaben vergleichen.
In etwa wie oben.
Und wegen const nochmal:
das habe ich soweit verstanden.
Aber wenn man den Wert, also "Hallo Welt"
ändern will, muss man ja das const weglassen.
-
Hast du mal im Debugger durchgesehen, was während der Schleife eigentlich passiert?
Edit: Und wie kommst du überhaupt auf so merkwürdige Werte wie 6 für "gleich" und 3 für "verschieden"?
-
CStoll schrieb:
Hast du mal im Debugger durchgesehen, was während der Schleife eigentlich passiert?
Edit: Und wie kommst du überhaupt auf so merkwürdige Werte wie 6 für "gleich" und 3 für "verschieden"?
hm du meinst sicher 5 für "gleich".
Das sind nur 2 zufällige Werte um es zu vergleichen.
Ist doch egal ob ich jetzt 1 2 3 oder 4 nehme?
Mit dem Debugger habe ich noch keine Erfahrungen.
-
Wenn man nur zwei Werte braucht, bietet sich eigentlich immer "bool" an, das ist zudem aussagekräftiger. Versuchs doch mal so:
bool equal = true; for (...) { if ( /*strings an der aktuellen Stelle ungleich*/ ) { equal = false; break; } } if ( equal ) .... else ....
-
Flashgott schrieb:
CStoll schrieb:
Hast du mal im Debugger durchgesehen, was während der Schleife eigentlich passiert?
Edit: Und wie kommst du überhaupt auf so merkwürdige Werte wie 6 für "gleich" und 3 für "verschieden"?
hm du meinst sicher 5 für "gleich".
Das sind nur 2 zufällige Werte um es zu vergleichen.
Ist doch egal ob ich jetzt 1 2 3 oder 4 nehme?Ja, ich meinte 5. Und es ist zumindest ungewohnt - normal verwendet man für eine Ja/Nein-Aussage nicht zwei willkürliche Zahlenwerte, sondern einen bool (true oder false).
Mit dem Debugger habe ich noch keine Erfahrungen.
Dann solltest du das mal machen (btw, was für einen Compiler verwendest du eigentlich?)
Für den Anfang kannst du auch vor der if()-Anweisung eine Ausgabe einfügen, damit du den Überblick behältst:
cout<<vergleich<<". Vergleich: "<<*coption1<<"-"<<*coption2<<endl;
-
hm in Code::Blocks ist MinGW oder?
ich habs jetzt mal so gemacht zum Testen.if (*coption1 == *coption2) { cout << *coption1 << endl; coption1++; coption2++; erg = 5; }Es wird nur
H
a
l
l
oausgegeben
und wenn ich es so wie du mache
cout<<vergleich<<". Vergleich: "<<*coption1<<"-"<<*coption2<<endl;wird nur H-H A-A L-L O-O -
ausgegeben
-
Ich lgaube, jetzt sehe ich auch deinen Fehler - du erhöhst in jedem Schleifendurchgang deine char-Zeiger und dadurch veringert sich auch der Wert, den strlen() zurückgibt. Nach sechs Schleifedurchgängen ist vergleich=6 und coption1 zeigt auf das 'W' -> strlen(coption1) liefert 5 zurück und die Schleife wird abgebrochen.
Wozu brauchst du überhaupt die Variable 'vergleich'? Entweder du verwendest sie als Index bei den späteren Vergleichen - oder du nutzt die String-Literale direkt, um das Ende festzustellen:
int erg = true; for(int vergleich=0;vergleich!=strlen(coption1)+1&&vergleich!=strlen(coption2);++vergleich) { if(coption1[vergleich]!=coption2[vergleich]) { erg=false; break; } } //oder int erg = true; for (; *coption1!='\0' && *coption2!='\0';) { if (*coption1 == *coption2) { coption1++; coption2++; } else { erg = false; break; } }
-
ok vielen dank!

-
Macht es doch - es hört erst beim \0 auf - und das ist in C-Strings die Marke "hier ist der String zu Ende".
-
ah stimmt
Vielen dank es klappt jetzt.
Leider habe ich noch ein Problem mit einem String programm
#include <iostream> #include <string> using std::cout; using std::endl; using std::cin; using std::string; int main() { const char *lies1 = 0; string string1; cin >> string1; for (int i = 0; i < string1.size(); i++) { *lies = string1[i]; lies++, } cout << "Es wurde "; for (int i = 0; i != strlen(lies1)+1; i++) cout << *lies; cout << "eingeben!" << endl; system("PAUSE"); return 0; }Das programm soll statt strings cstrings verwenden,
um etwas einzulesen und das dann auszugeben.
Also mache ich erst cin >> in einen normalen string
und dann tausche ich es in einen cstring um.
Kann es aber nicht kompilieren!
no match for operator * in lies *lies = string1[i];
-
Erstens: die Namensänderung "const char* lies1 = 0;" vs. "*lies=string1[i];" ist hoffentlich ein C&P-Fehler.
Zweitens: In einen "const char*" darfst du nichts reinschreiben - hier brauchst du einen nicht-konstanten "char*".
Drittens: Du hast noch keinen Speicher angefordert, wo du die String-Daten reinschreiben könntest - das dürfte dir im laufenden Programm einen SegFault entgegenwerfen.
Viertens: Eventuell solltest du dich etwas intensiver mit Pointer-Arithmetik auseinandersetzen.
PS: Und fünftens: Wenn es dir nicht um den Lerneffekt geht - bleib lieber bei std::string.
-
Es geht aber um den Lerneffekt

-
Dann lern's gleich richtig

(übrigens können cin und cout auch direkt in char-Arrays schreiben/lesen)char lies[100]; cin>>lies; cout<<"Sie haben "<<lies<<" eingegeben\n";
-
ok danke
damit sind meine Probleme gelöst
Frohe Weihnachten :xmas1:
-
Flashgott schrieb:
ich muss als Übung ein Programm schreiben,...
OK, das erklärt's ... und damit ist es halt unumgänglich (ist ja schonmal erfreulich, dass in dieser Übung auch gleich std::string vorgestellt wird).
Flashgott schrieb:
Aber wenn man den Wert, also "Hallo Welt"
ändern will, muss man ja das const weglassen.Nein!!!
Wenn Du "Hallo Welt" ändern möchtest, darfst Du es nicht in den konstanten Speicher legen, sondern selbst Speicher dafür bereitstellen ... z.B. über ein Array:char option1[100] = "Hallo Welt!"; // erzeugt ein Array von char-s und belegt den Anfang mit "Hallo Welt" (inkl. '\0'In den darfst Du dann nach Lust&Laune reinschreiben ... aber eben höchstens 100 Zeichen (inkl. abschließender '\0').
Gruß,
Simon2.