#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
.