2015-12-01 7 views
-1

Я только заметил это странное поведение string :: find. У меня есть непустая строка b и еще одна пустая строка a. Когда я вызываю b.find (a), он должен возвращать npos, но возвращает 0.Почему поиск пустой строки в непустой строке возвращает 0

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    // your code goes here 
    string a , b("ABC"); 
    if (string::npos == b.find(a)) std::cout << std::endl << "TRUE" << std::endl; 
    return 0; 
} 

Выше кода не печатает true. Может кто-нибудь, пожалуйста, объясните мне, что это значит? Так как a пусто и b непусто, то найти пустую строку в непустой не имеет смысла и, следовательно, является ошибкой. Поэтому он должен вернуть НСС

Благодарности

+6

Пустая строка действительно содержится в любой другой строке, поэтому результат 0 правильный – Vitor

+0

Это один из тех случаев, когда вы должны быть осторожны и дезинфицировать свой ввод. – Casey

+3

* «Когда я вызываю b.find (a), он должен возвращать npos« * - откуда вы получаете эту идею? В будущем проверьте [cppreference docs] (http://en.cppreference.com/w/cpp/string/basic_string/find), прежде чем предполагать такие вещи - это объясняет это очень четко. –

ответ

8

пустая строка подстроку всех строк. Первая позиция, где существует пустая подстрока, - это первый индекс. find возвращает первый индекс, где находит первое вхождение подстроки.

Если определение пустой подстроки вас смущает, рассмотрим алгоритм, который проверяет, является ли строка подстрокой. Алгоритм проверяет каждый символ в потенциальной подстроке и сравнивает его с соответствующим символом в другой строке. Если какой-либо символ не совпадает, то это не подстрока. Если конец искомой строки достигнут, значит, это совпадение. В случае пустой строки ни один символ не может отличаться, потому что символов нет. Окончание достигается немедленно, и вывод заключается в том, что пустая строка является подстрокой.

+0

* «На самом деле все строки содержат бесконечно много пустых подстрок». * - это немного OOT - я бы подсчитал их как одну позицию в строке, хотя верно, что наивная find-at-pos/pos + = x логика .size() может застревать в бесконечном цикле .... –

+0

И становится хуже, когда вы используете 'std :: regex' ... – Casey

+0

@TonyD верно ли, что любое из наших утверждений кажется очень философским вопросом. Я удалю его, так как это не существенно. – user2079303

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