• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

C++ if- Vergleich

Guten Tag,

ich weiß ich sollte mich eher Schämen für ein solches Problem hier eine Frage zu stellen, aber ich brauche nun schon viel zu lange für eine Lösung.

Es handelt sich dabei um ein einfaches in C++ geschriebenes Vergleichscript ... eigentlich sogar sehr einfach.

Nun ich habe eine CString Klasse geschrieben die mit einer Funktion getString den aktuelle String als char zeiger ausgibt.

Einmal kurz mein Problem script ....

void CApp::runMenu()
{
char *c_buff = new char;
bool i = true;
CString CStr_buff;
while(i==true)
{
cout << ">";
cin >> c_buff[0];
CStr_buff = CStr_buff + c_buff[0];
if(CStr_buff.getString=="end")
{
i = false;
}
}
}

nun, es kommt hier nciht auf die Feinheit des Programmierens sondern auf den Fett markierten Punkt an. Sollte ein Char zeiger nicht mit einem text string vergleichbar sein??? Ich habe auch schon probiert es statt mit "end" mit einem gleichwertigen zeiger zu vergleichen. NICHTS. Beim Debuggen stelle ich fest das die Werte zu Laufzeit aber gleich sind.....

Ich hoffe es war verständlich und mit kann geholfen werden ...

danke schonmal byby :0)
 

Tantalus

Member
Also meines wissens kannst du zwei Zeichenketen nicht direkt miteinander vergleichen.
GIbt der Compiler keine Warnung aus??
Wenn du zwei char pointer vergleichst zeigen ja beide auf verschiede Stellen im Speicher und sind daher nicht gleich, auch wen sie die gleiche Zeichenkette beinhalten.
Und die adresse von einem char pointer mit einer Zeichenkonstante zu vergleichen macht somit auch keinen Sinn.
Du müsstest bei beiden Zeichenketten jedes einzelne Zeichen vergleichen, dafür gibts auch die funktion strcmp(char*,char*) in der string.h.
 

spunti

Hacker
Ich hab von C keine Ahnung, aber in Java würdest du auch darüber stolpern.
Strings sind da Objekte und die kannst du nicht ohne weiteres mit == vergleichen.
Dafür gibts Methoden wie string1.compareTo(string2) oder string1.equals(string2).

grüße von der front
spunti
 
OP
J

JennaJamson

Member
Nun das war ja auch mein erster Gedanke das beide auf die alsche Stelle in einem Speicherbereich zeigen ... logisch eigentlich, aber ....

Erstelle ich einen Zeiger und gebe bei cout keine vorzeichen, bekomme ich doch auch die text ausgabe direckt die ich irgendwie so oder so erhalten müsste.

Wenn ich die bieden Zeiger vergleichen würde, müsste ich doch ein & vordie Variable setzen. Nur so bekomme ich doch die Adresse oder nciht?

Und ich vergleiche ja nciht das String Objeckt sondern bekomme einen Zeiger ... von char

Aber egal, ich danke euch für eure Hilfe und werde dann mal implementierte Funktionen verwenden. Danke schön und einen schönen Abend noch
 

Snubnose

Hacker
hmm, also 2 Sachen fallen mir auf:
strings vergleiche ich normalerweise mit strcmp()

und das CStr_buff.getString würde ich dringend als CStr_buff.getString() schreiben
 
OP
J

JennaJamson

Member
Vielen dank, den Fehler habe ich beim Compilieren auch schon bemerkt ....

liegt aber nciht da drann ... das es Funktionen gibt ist ja ok, aber warum oder vielleciht wie, geht es mit einem if- Vergleich ...

Naja also wie wir beschlossen haben geht es nicht, waarum ... werde ich noch ein bisschen schauen und überlegen.

Trotzdem vieln Dank byby :0)
 

PC-Ulf

Member
Der Wert von Zeigern wird immer und wurde schon immer als Adresse behandelt. Das ist auch der Sinn von Zeigern. Das ist zu vergleichen mit Seitenangaben in einem Inhaltsverzeichnis, auch wenn der Inhalt von Seite 3 und Seite 5 identisch sind, 3 und 5 sind es nicht.

Funktionen erkennen Zeiger, und deshalb kommen diese zum "Inhalt". Eine Modifikation des Zeigers in der Funktion ändert also z.B. nicht den Wert des Zeigers für den Aufruf.

Somit macht ein Verglich über if keinen Sinn (ohne zu den Inhalt zu gehen).
 
OP
J

JennaJamson

Member
Hmmm, das weiß ich ja, ich drücke mich bestimmt nur sehr ungeschickt aus ...

Naja, wie gesagt trotzdem danke ... :0)
 

Tantalus

Member
Also ich würde an deiner Stele wi gesagt die Funktion strcmp(char*,char*) verwenden oder aber was in bezug auf deine String klasse noch viel besser ist den Operator == überladen sodass du die getString() Methode nicht mehr brauchst und du dann so vergleichen könntest:
void CApp::runMenu()
{
char *c_buff = new char;
bool i = true;
CString CStr_buff;
while(i==true)
{
cout << ">";
cin >> c_buff[0];
CStr_buff = CStr_buff + c_buff[0];
if(CStr_buff=="end")
{
i = false;
}
}
}
 
OP
J

JennaJamson

Member
Hihi ... vielen Dank für deine anteilnahme.

:0)

Die funktion getString() bleibt und die == operator funktion wird hinzugefügt.
Die Klasse ist ja ncoh lange nicht fertig, es werden natürlich alle Operatoren und variablen- arten behandelt.

Einen schönen Tag ncoh byby :0)
 
Oben