2016-06-26 3 views
1

Ну код объясняет, что я пытаюсь сделатьstring.find() возвращает истинное противоправно

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; 

он возвращает истину, хотя needle отличается от haystack уведомлений бывших концов с \Path в то время как последние концами с \Name. .. как я мог точно сказать, содержит ли определенная строка другую?

+2

Вместо '\' попробуйте '\\'. '\ 0' завершает' 0'. – AlexD

+2

Эти строки в строках имеют особое значение в строковых литералах C и C++. – juanchopanza

+0

@AlexD это, кажется, ответ, как я могу игнорировать это и найти строку в другой, как обычно, мы можем делать в C#, например, с str.Contains (str2)? –

ответ

0

Символ-побег - символ \. Для того, чтобы использовать фактические \ характер вам нужно, чтобы избежать его \\. Так что ваш код должен быть изменен следующим образом:

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

Что делать, если я работаю с неизвестными строками, и я хочу сделать обычную проверку на константу? как str.Contains (str2) в C#? –

+0

@ AhmedT.Yousef, тогда вам нужен общий способ избежать вашей строки. Например, посмотрите здесь: http://stackoverflow.com/questions/2417588/escaping-ac-string –

+0

Не нужно делать каких-либо специальных экранов, если ваша строка считывается из файла, реестра, клавиатуры и т. Д. Вам нужно только избегать букв *. –

0

Вы можете сделать это следующим образом:

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 является проблемой для вы, как это конец конструктора преждевременно

2

Благодаря завершающего «\ 0» строки короче, чем вы думаете:

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

Другие непредусмотренные управляющие последовательности должны давать предупреждение компилятора:

г ++ предупреждение: неизвестно последовательность выхода: '\ R' (... и больше)

Вы можете посмотреть на: http://en.cppreference.com/w/cpp/language/string_literal

Смежные вопросы