У меня есть переменная типа std::string
. Я хочу проверить, содержит ли он определенную std::string
. Как бы я это сделал?
Есть ли функция, которая возвращает true, если строка найдена, и false, если это не так?
У меня есть переменная типа std::string
. Я хочу проверить, содержит ли он определенную std::string
. Как бы я это сделал?
Есть ли функция, которая возвращает true, если строка найдена, и false, если это не так?
Используйте std::string::find
следующим образом:
if (s1.find(s2) != std::string::npos) {
std::cout << "found!" << '\n';
}
Примечание: "найдено!" будет напечатан, если s2
является подстрокой s1
, и s1
и s2
имеют тип std::string
.
Вы можете попробовать использовать функцию find
:
string str ("There are two needles in this haystack.");
string str2 ("needle");
if (str.find(str2) != string::npos) {
//.. found.
}
На самом деле, вы можете попробовать использовать boost-библиотеку, я думаю, что std::string не предоставляет достаточный метод для выполнения всей общей операции с строкой. В boost вы можете просто использовать boost::algorithm::contains
:
#include "string"
#include "boost/algorithm/string.hpp"
using namespace std;
using namespace boost;
int main(){
string s("gengjiawen");
string t("geng");
bool b = contains(s, t);
cout << b << endl;
return 0;
}
Вы можете попробовать это
string s1 = "Hello";
string s2 = "el";
if(strstr(s1.c_str(),s2.c_str()))
{
cout << " S1 Contains S2";
}
Если вы не хотите использовать стандартные библиотечные функции, ниже приведено одно решение.
#include <iostream>
#include <string>
bool CheckSubstring(std::string firstString, std::string secondString){
if(secondString.size() > firstString.size())
return false;
for (int i = 0; i < firstString.size(); i++){
int j = 0;
// If the first characters match
if(firstString[i] == secondString[j]){
int k = i;
while (firstString[i] == secondString[j] && j < secondString.size()){
j++;
i++;
}
if (j == secondString.size())
return true;
else // Re-initialize i to its original value
i = k;
}
}
return false;
}
int main(){
std::string firstString, secondString;
std::cout << "Enter first string:";
std::getline(std::cin, firstString);
std::cout << "Enter second string:";
std::getline(std::cin, secondString);
if(CheckSubstring(firstString, secondString))
std::cout << "Second string is a substring of the frist string.\n";
else
std::cout << "Second string is not a substring of the first string.\n";
return 0;
}
Из такого большого количества ответов на этом сайте я не нашел четкого ответа, поэтому через 5-10 минут я сам нашел ответ. Но это можно сделать в двух случаях:
Итак, предположим, что мы ищем подстроку "cd" в строке "abcde", и мы используем простейшую встроенную функцию substr в C++
за 1:
#include <iostream>
#include <string>
using namespace std;
int i;
int main()
{
string a = "abcde";
string b = a.substr(2,2); // 2 will be c. Why? because we start counting from 0 in a string, not from 1.
cout << "substring of a is: " << b << endl;
return 0;
}
для 2:
#include <iostream>
#include <string>
using namespace std;
int i;
int main()
{
string a = "abcde";
for (i=0;i<a.length(); i++)
{
if (a.substr(i,2) == "cd")
{
cout << "substring of a is: " << a.substr(i,2) << endl; // i will iterate from 0 to 5 and will display the substring only when the condition is fullfilled
}
}
return 0;
}
В С++ 11 вы также можете использовать regex_search следующим образом:
if (regex_search(s1, regex(s2))) {
cout << "found" << endl;
}
Это простая функция
bool find(string line, string sWord)
{
bool flag = false;
int index = 0, i, helper = 0;
for (i = 0; i < line.size(); i++)
{
if (sWord.at(index) == line.at(i))
{
if (flag == false)
{
flag = true;
helper = i;
}
index++;
}
else
{
flag = false;
index = 0;
}
if (index == sWord.size())
{
break;
}
}
if ((i+1-helper) == index)
{
return true;
}
return false;
}
#include <algorithm> // std::search
#include <string>
using std::search; using std::count; using std::string;
int main() {
string mystring = "The needle in the haystack";
string str = "needle";
string::const_iterator it;
it = search(mystring.begin(), mystring.end(),
str.begin(), str.end()) != mystring.end();
// if string is found... returns iterator to str first element in mystring
// if string is not found... returns iterator to mystring.end()
if (it != mystring.end())
// string is found
else
// not found
return 0;
}
Вы также можете использовать пространство имен System. Затем вы можете использовать метод содержит.
#include <iostream>
using namespace System;
int main(){
String ^ wholeString = "My name is Malindu";
if(wholeString->ToLower()->Contains("malindu")){
std::cout<<"Found";
}
else{
std::cout<<"Not Found";
}
}
Мы можем использовать этот метод вместо. Просто пример из моих проектов. Ссылайтесь на код. Некоторые дополнительные услуги также включены.
Посмотрите на заявления if!
/*
Every C++ program should have an entry point. Usually, this is the main function.
Every C++ Statement ends with a ';' (semi-colon)
But, pre-processor statements do not have '; at end.
Also, every console program can be ended using "cin.get();" statement, so that the console won't exit instantly.
*/
#include <string>
#include <bits/stdc++.h> //Can Use instead of iostream. Also should be included to use the transform function.
using namespace std;
int main(){ //The main function. This runs first in every program.
string input;
while(input!="exit"){
cin>>input;
transform(input.begin(),input.end(),input.begin(),::tolower); //Converts to lowercase.
if(input.find("name") != std::string::npos){ //Gets a boolean value regarding the availability of the said text.
cout<<"My Name is AI \n";
}
if(input.find("age") != std::string::npos){
cout<<"My Age is 2 minutes \n";
}
}
}