string vergleiche
-
Hallo, ich habe da eine frage.
Folgendes Szenario, ich lese aus einer Datei die ersten 5 Zeichen in einen std::string ein.
Und vergleiche ihn danach mit einem string oder const char*.Die If anweisung geht aber immer in den else zweig. Warum ?
std::string s("hallo"); if(s.c_str() == "hallo") { blubb//geht nie rein... } else ... -> hier geht er immer rein.
Ist das ein Bug ? Und wenn ja, wie kann ich ihn umgehen ?
Devil
-
if(s == "Hallo")
nicht mit c_str().
-
oder wenns unbedingt sein muss, mit strcmp
-
oder
strcmp(s.c_str(), "Hallo");
Niemals C Strings mit dem einfachen Vergleichoperator vergleichen immer mit strcmp.
-
wie kommst du überhaupt auf die idee das das ein bug sein könnte? das ist doch das simpelste konstrukt...
-
Hm, ja ist einleuchtend...
Hab früher immer mit CString gearbeitet, und bin noch net ganz an Standard C++ gewöhnt... *g*
Devil
-
Immer noch ein problem.
Ich lese in einer datei. Ich will die 5 ersten zeichen in der datei lesen:char c5[5]; file.read(c5,5)
Jetzt hab ich am ende von char noch komische Zeichen. immer die selben, immer 2-3.
ein c5[5]= '\0' behebts wieder, aber das ist mir eigentlich zu dirty...wie kann ich sonst die Zeichen einlesen ? Liegts am char ?
Devil
-
Ich denke mal read verlnagt ein Array mit n-1 Zeichen, damit das n-te Zeicbne auf \0 gesetzt werdebn kann.
-
Ich würde sagen read() liest soviel ein, wie du bei read() angibst.
Vermute es liegt an deiner Ausgabe. Die gibt nämlich meistens solange aus, bis sie auf eine 0 trifft.
-
Original erstellt von devil81:
**char c5[5]; file.read(c5,5)
[..]
ein c5[5]= '\0' behebts wieder, aber das ist mir eigentlich zu dirty...
**Ja, das ist nicht nur dirty sondern auch Zufall. Der Speicher bei c5[5] gehört dir gar nicht mehr und du hattest nur das Pech, dass das Programm noch nicht abgestürzt ist.
-
meine ich auch.
auch sieht das hier mehr nach c aus als c++, devil
ein char* string ist halt nur ein einfach allokierter string der seine eigene länge nicht kennt. ein solcher string wird logisch mit '\0' abgeschlossen. bei einigen funktionen wird das halt automatisch gemacht (fscanf und dessen ableger) und bei anderen wieder nicht (read wie du jetzt auch weisst, getline ist das gleiche).
meine empfehlung kann daher nur lauten, char* string möglichst zu meiden.
-
und die lösung ?
Wie kann ich es sonst korrekt einlesen ?Devil
-
Ich würde sagen mit
char c5[6]; //das sechste für das Nullbyte file.read(c5,5); c5[5] = '\0';
-
char c5[6]; file.read(c5,5); c5[5]=0;
-
ich wuerde aber noch auf failbit testen - denn schliesslich koennen auch weniger als 5 zeichen gelesen werden (zB wegen EOF)
-
read() liest maximal soviel wie man angegeben hat und in gcount() steht dann drin wieviel wirklich eingelesen wurde.
Ich würde also buf[file.gcount()] = 0; machen.