str::find всегда возвращает 1, даже если значение отсутствует в массиве в cpp

#c

#c

Вопрос:

 int main()
{
    const char* plating[8] = { "Agsdf","AgNsdfi","CuAsdfg","Nsdfi","NsdfiAg","NiPsdfd","Nonsfe","Psfd" };
    bool press = false;
    press = std::find(begin(plating),end(plating),"88love");
    cout<<press<<endl;
    return 0;
}
 

**
Вывод:- 1
**

** Принятый вывод:- 0 **

Комментарии:

1. пожалуйста, используйте только языковые теги, которые связаны с вашим вопросом

2. совет: пометка 4 совершенно разных языков — лучший способ сбора голосов

3. std::find возвращает итератор. Назначение этого итератора bool на самом деле не имеет смысла.

4. еще один совет: прочитайте некоторую документацию. Без этого неудивительно, что ваши ожидания отклоняются от фактического результата

5. Кроме того, вы сравниваете указатели, а не содержимое строки…

Ответ №1:

std::find не возвращает 1 . press также не является 1 . Происходит то, что std::find возвращает итератор, который в вашем случае является просто указателем. Указатель, преобразованный в a bool true , равен, если это nullptr не так. При печати, которое true вы получаете 1 на выходе.

Правильный способ использования std::find — сравнить возвращенный итератор end(plating) , чтобы узнать, была ли найдена строка. Однако вы сравниваете указатели, и даже если вы вызываете find со строкой, которая находится в массиве, вы не обязательно получаете правильный результат.

Вместо этого вы должны использовать std::string :

 std::vector<std::string> plating = {" ..." ,"..."};
std::string needle{"88love"};
if ( std::find(plating.begin(),plating.end(),needle) == plating.end()) {
    std::cout << needle << " was not found! n";
}
 

Ответ №2:

Если std::find() элемент не найден, он возвращает итератор. last Поэтому изменение press = std::find(begin(plating),end(plating),"88love"); на press = std::find(begin(plating),end(plating),"88love")!=last(plating); должно решить вашу проблему. То, как вы пытаетесь это сделать, итератор преобразуется в a bool , что будет true , если возвращаемый итератор указывает на last .