std::wstring: Verkettung mit + hat keine Wirkung
Die Lösung ist wahrscheinlich offensichtlich, aber ich sehe es nicht. Ich habe diese einfache C++ - code:
//Build the search pattern
//sPath is passed in as a parameter into this function
trim_right_if(sPath, is_any_of(L"\\"));
wstring sSearchPattern = sPath + L"\\*.*";
Mein problem ist, dass der + - operator hat keine Auswirkungen (geprüft im debugger). Der string sSearchPattern
wird initialisiert, der Wert von sPath
nur.
Hinweise: sPath
ist ein wstring
.
Beispiel, was ich erreichen will:
sSearchPattern -> C:\SomePath\*.*
Mehr Info:
Wenn ich mir anschaue, sPath im debugger sehe ich zwei NULL-Zeichen nach dem letzten Zeichen. Wenn ich mir anschaue, sSearchPattern, die "\*.*" ist angehängt, aber nach zwei NULL-Zeichen. Eine Erklärung für das?
- Was ist die Erklärung der
sPath
? - Wie stellen Sie fest, dass es keine Auswirkungen hat? Was tun Sie mit
sSearchPattern
? - Poste realen code, bitte. Dein problem ist fast garantiert woanders.
- Sind Sie wirklich zuordnen
char*
zuwstring
? - Hinzugefügt Deklaration von sPath. Ich überprüfte den Inhalt der sSearchPattern in den debugger. Und dies ist der eigentliche code.
- Ich kann nicht sehen, jede Erklärung der
sPath
, obwohl 🙁 - sPath ist eine Funktion der parameter.
- Bitte ändern Sie nicht Ihre Frage hin und her, aber anstatt es zu aktualisieren, durch hinzufügen von zusätzliche Infos.
- Ich legte es in. Wenn dies isn ' T das richtige zu tun, wird er haben, um es zu beheben. Ansonsten würden wir schließen müssen, ist diese Frage nicht beantwortbar.
- Die Hölle, dann schreiben Sie einfach den code, der notwendig ist, um das Problem zu reproduzieren! Schauen Sie in meinem Beispiel-code. Dieser funktioniert. Was ist anders in Ihnen?
- Ich fügte hinzu, eine zweite
` to
C:\SomePath\`. In deinem code gibt es zwei\` after
C:`, richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte dies funktionieren, und zwar funktioniert bei mir auf VS2010 SP1:
Diese Drucke
C:\SomePath\*.*
für mich.
std::wstring + pointer
, und ist nicht ein Fehler.:)
Ernst, obwohl, die ursprüngliche Antwort in der Tat enthielt einen Fehler. Ich entfernte es, wenn das Teil der Antwort obsolet insgesamt nach Helge verändert seine Frage, Ben Hinzugefügt sein Kommentar während ich damit beschäftigt war (oder kurz danach, kein Zweifel, immer noch an die alte Antwort). Ich habe nicht gemeint, um Ben ' s Aussage scheint dumm. Ich habe nur gemerkt, dass diese änderung nicht aufgezeichnet jetzt sah ich, dass der laufende Kommentar-Diskussion darüber.Als ich fand heraus, das zwei NULL-Zeichen gespeichert, an das Ende der Schnur waren das problem. Offenbar std::wstring kümmert sich nicht um Null-Werte wie gute alte C-string funktioniert. Wenn denkt, dass es ein string ist 10 Zeichen lang, ist es nicht egal, wenn einige, die die 10 Zeichen sind NULL-Zeichen. Wenn Sie dann Anhängen, um die Zeichenfolge, die zusätzliche Zeichen angehängt, nachdem der 10ths char. Wenn das Letzte Zeichen der Zeichenfolge sein passieren zu Null, erhält man:
So ein string kann nicht wirklich überall eingesetzt werden.
Wie habe ich das NULL-Zeichen am Ende der ursprünglichen Zeichenfolge? Ich wstring verwendet.resize() in eine andere Funktion, welche pads von der Zeichenfolge mit Nullzeichen. Ich Tat dies, um pass &string[0], um eine Windows-API-Funktion erwartet einen LPWSTR.
Nun, ich weiß, das funktioniert nicht, ich benutze eine wahre LPWSTR statt. Das ist ein bisschen ungeschickt, aber es funktioniert. Aus MFC, dachte ich, könnte ich std::wstring wie CString mit seiner GetBuffer und Release-Methoden.
std::vector<WCHAR>
std::vector<char>
überstd::string
für lese-und Schreibzugriff.Etwas in deinem code ist das hinzufügen von zusätzlichen null-Zeichen am Ende der Zeichenfolge. Dein Fehler liegt im code.
String-Verkettung funktioniert bestens.
std::wstring
ist nicht null-terminiert und so die Verkettung fügt nur am Ende des Puffers. Dies machtstd::wstring
etwas anders als ein C-string, denn es kann halten Sie null-Zeichen. Ich vermute, dass diese nuance ist die Quelle aller Verwirrung.