2016-06-26 3 views
1

Nun der Code erklärt, was ichstring.find() gibt wahr zu Unrecht

auto haystack = wstring(L"\REGISTRY\MACHINE\SOFTWARE\WOW6432Node\Data\0\Path"); 
auto needle = wstring(L"\WOW6432Node\Data\0\Name"); 
auto found = haystack.find(needle) != haystack.npos; 
cout << found << endl; 

zu tun, ich versuche es true zurück, obwohl needle anders als haystack Mitteilung die ehemaligen Enden mit \Path während die letzteren Enden mit \Name. .. wie könnte ich genau sagen, ob bestimmte string eine andere enthält?

+2

Versuchen Sie '\' anstelle von '\'. '\ 0' beendet' 0'. – AlexD

+2

Those \ in den Strings haben sie eine besondere Bedeutung in C und C++ String-Literale. – juanchopanza

+0

@AlexD das scheint die Antwort zu sein, wie könnte ich das ignorieren und eine Zeichenfolge in einer anderen finden normalerweise wie wir in C# zum Beispiel mit str.Contains (str2) tun können? –

Antwort

0

Das Zeichen \ ist das Escape-Zeichen. So verwenden Sie den tatsächlichen \ Charakter müssen Sie es entkommen mit \\. So Ihr Code wie folgt geändert werden muss:

auto haystack = wstring(L"\\REGISTRY\\MACHINE\\SOFTWARE\\WOW6432Node\\Data\\0\\Path"); 
auto needle = wstring(L"\\WOW6432Node\\Data\\0\\Name"); 
auto found = haystack.find(needle) != haystack.npos; 
cout << found << endl; 
+0

Was ist, wenn ich mit unbekannten Saiten arbeite und ich möchte einen normalen Check für eine Konstante? wie str.Contains (str2) in C#? –

+0

@ AhmedT.Yousef, dann brauchen Sie eine allgemeine Möglichkeit, Ihre Zeichenfolge zu entkommen. Schauen Sie sich zum Beispiel hier an: http://stackoverflow.com/questions/2417588/escaping-ac-string –

+0

Es ist nicht nötig, spezielle Befehle auszuführen, wenn Ihre Zeichenfolge aus einer Datei, der Registry, der Tastatur usw. gelesen wird. Sie müssen nur * Literalen * entkommen. –

0

Sie können es wie folgt tun:

wstring haystack = wstring(LR"P(\REGISTRY\MACHINE\SOFTWARE\WOW6432Node\Data\0\Path)P"); 
wstring needle = wstring(LR"P(\WOW6432Node\Data\0\Name)P"); 
bool found = haystack.find(needle) != haystack.npos; 
cout << (char*)(found?"True":"False") << endl; 

\ 0 ist ein Problem für Sie, wie es Ende Konstruktor vorzeitig

2

Durch die abschließende ‚\ 0‘ die Saiten sind kürzer als Sie denken:

auto haystack = std::wstring(L"\REGISTRY\MACHINE\SOFTWARE\WOW6432Node\Data"); 
auto needle = std::wstring(L"\WOW6432Node\Data"); 

Die anderen unbeabsichtigten Escape-Sequenzen sollten eine Compiler-Warnung erzeugen:

g ++: Warnung: unbekannt Escape-Sequenz: '\ R' (... mehr)

Sie in aussehen: http://en.cppreference.com/w/cpp/language/string_literal

Verwandte Themen