Confusion mit CString::Find()?!?



  • Guten Morgen,

    ich bin ein wenig verwirrt, ich lese aus einer Datei Zahle in hexadezimaler Darstellung ein. Es können sich auch mehrere Zahlen hintereinander in einer Reihe befinden. Diese sind dann durch ein Leerzeichen getrennt.
    Wenn ich nun einen String habe und nach der Zeichenkette "0x" suche,

    // in m_strFileContent steht der Inhalt, hier: "0x3D"
    int iHexPos = -1;
    iHexPos = m_strFileContent.Find("0x");
    

    gibt die CString::Find() - Funktion '1' zurück.
    Habe ich aber einen längeren String mit mehreren Zahlen,

    // in m_strFileContent steht der Inhalt, hier: "0x3D 0xAA 0x04"
    int iHexPos = -1;
    iHexPos = m_strFileContent.Find("0x");
    

    dann gibt die Funktion wie erwartet eine '0' wieder.

    Weiß jemand, warum dies so ist?

    MfG,
    Paul.



  • Schau dir mal den eingegebenen String GANZ GENAU an - eventuell steht ja noch ein Leerzeichen vor der Hex-Zahl, das du übersehen hast.

    (zur Not hilft ein TRACE("%c",m_strFileContent[iHexPos]);)



  • Werde ich nochmal überprüfen, aber eigentlich benutze ich schon eine Funktion, die mir die Leerzeichen,Tabulatoren, etc. am Anfang löscht.
    Melde mich gleich.

    EDIT: Hier das Ergebnis: An der Position iHexPos -> "x"
    An der Position iHexPos-1 -> "0"
    Noch ne Idee?



  • Dieses Problem tritt auch auf, wenn ich nach
    "<Length>" suche?! 😕
    Dann bekomme ich auch eine 1.

    Seltsam. Habe ich aber ein anderes Wort (Bsp:"<Data>"),dann geht es.
    Und im String ist definitiv kein Leerzeichen mehr.



  • Habs grad mit der 2005er getestet. Der bringt bei mit die 0, nicht die 1. Ich würd eher wie CStoll tippen, dass irgendwas mit deinem Ausgangsstring nicht stimmt.
    Tu doch mal in deinem Sourcecode direkt über dem Find deinen CString das "0x3D" zuweisen und schaue, was dann passiert.



  • Also, habe nun Folgendes versucht:

    m_strLineContent = "0x3D";
    iHexPos = m_strLineContent.Find("0x"); // iHexPos = 1
    
    CString test = "0x3D";
    iHexPos = test.Find("0x"); // iHexPos = 1
    
    /* in beiden Fällen gibt TRACE an der Position ein 'x' wieder */
    

    Komischerweise nur an der einen Stelle.
    Und der Zusammenhang zwischen <Length> und dem ist, dass hier auch Längen-Angaben herausgelesen werden, bloß nicht aus einer XML-Datei.

    Wahrscheinlich liegt der Fehler dann doch woanders, schließlich geht es an anderen Stellen einwandfrei.
    EDIT: Obwohl dann ja der zweite Teil funktionieren sollte (das mit CString test).



  • Welche Visual Studio Version nimmst du?
    Tu dir mal das iHex in ner MessageBox ausgeben lassen!



  • Ich nutze Visual C++ .NET 2003.

    Die MessageBox sagt auch 1. Gibt es da manchmal Unterschiede?
    Was nun wiederum seltsam ist, dass wenn ich nun schreibe:
    CString strTest;
    und dann eintippe
    strTest. // nun sollten doch Funktionen angeboten werden, die erscheinen aber nicht!? Unten links steht -> IntelliSense: 'No additional information available'



  • Warte, nun funktioniert das IntelliSense wieder.

    Ist das nicht so, dass in C++-Manier so gecastet wird:
    int (a);
    und in C-Manier:
    (int) a;
    ?? Oder vertue ich mich da?
    Denn ich hatte eine Zeile drüber gecastet gehabt.

    Aber iHexPos gibt immer noch 1 wieder.



  • C++ cast geht mit static_cast,dynamic_cast, const_cast und reinterpret_cast. Der alte C-Cast ist weiterhin möglich. Sowas wie int(a) ist Delphi, habsch aber in C++ noch nie gesehen^^

    Hast mal die MEssagebox probiert? Weil ich habe festgestellt, das selten der Debugger vom 2005er Aussetzer hat. Nicht das der dir einfach nen falschen Wert anzeigt.

    edit: ok ich les grad drüber MEssageBox hast schon gemacht^^



  • int (a);

    funktionert aber. 🙂 Er meckert nicht.
    ... nachschlag...

    Habe das aus dem Erlenkötter-Buch "C++ - Objektorientiertes Programmieren von Anfang an". ^^
    Damit habe ich vor einigen Jahren angefangen. 🙂

    NACHTRAG: Ups, einige Zeilen darunter steht, dass die Form wohl noch erlaubt sei, man jedoch dem ISO-Standard entsprechend besser static_cast<> verwenden sollte. 🤡 *peinlich*



  • Ahhhh ja dürfte der direkte Aufruf des Operators sein^^ Bin wohl noch zu müde heut^^



  • Trink Kaffee, manchmal hilft's. 🙂 (schon meinen Nachtrag im obigen Post gelesen...)



  • ah ja jetzt gelesen^^

    naja zu deinem eigentlichen Prob fällt mir jetzt erstmal leider auch nix mehr ein :-| ist schon komisch

    hängst evtl mit nem ASCII/ANSI-Problem zusammen?



  • Muss ich überprüfen.
    Danke für deine Bemühungen. 🙂
    👍

    MfG,
    Paul.


Anmelden zum Antworten