স্ট্রিংয়ে সি ++ তে একটি স্ট্রিং রয়েছে কিনা তা পরীক্ষা করুন


493

আমি টাইপ একটি পরিবর্তনশীল আছে std::string। আমি এটিতে একটি নির্দিষ্ট আছে কিনা তা পরীক্ষা করতে চাই std::string। আমি যে কিভাবে করতে হবে?

এমন কোনও ফাংশন রয়েছে যা স্ট্রিংটি পাওয়া গেলে সত্য হয় এবং এটি না হলে মিথ্যা হয়?


6
আপনি কি চর * স্ট্রিং বা এসটিএল থেকে স্ট্রিং বোঝাতে চাইছেন?
8:30 এ এথ্রেসগুলি

1
এটি কোনও চর * স্ট্রিং নয়। এটি ব্যবহারের জন্য আমাকে # অন্তর্ভুক্ত <স্ট্রিং> করতে হয়েছিল।
নিউরোমান্সার

1
সমাধানগুলি সন্ধান করতে চাইলে স্ট্রিংয়ের জন্য এস 2 ব্যবহার করছে। যদি আমি এস 2 এর পরিবর্তে "এটি একটি স্ট্রিং" এর মতো কিছু ব্যবহার করি তবে কি এটি এখনও কার্যকর হবে?
নিউরোমান্সার

2
হ্যাঁ কারণ স্টাড :: স্ট্রিং টাইপের জন্য স্ট্রিং লিটারল কনস্ট্রাক্টর রয়েছে।

18
কেউ দয়া std::basic_string::containsকরে stdlib এ যুক্ত করার জন্য প্রস্তাব দিন।
Emlai

উত্তর:


722

std::string::findনিম্নলিখিত হিসাবে ব্যবহার করুন :

if (s1.find(s2) != std::string::npos) {
    std::cout << "found!" << '\n';
}

দ্রষ্টব্য: "পাওয়া গেছে!" উভয় এবং প্রকারের s2একটি স্ট্রিং থাকলে মুদ্রিত হবে ।s1s1s2std::string


117

আপনি findফাংশনটি ব্যবহার করে দেখতে পারেন :

string str ("There are two needles in this haystack.");
string str2 ("needle");

if (str.find(str2) != string::npos) {
//.. found.
} 

27

প্রকৃতপক্ষে, আপনি বুস্ট লাইব্রেরিটি ব্যবহার করার চেষ্টা করতে পারেন, আমার মনে হয় স্ট্যান্ড :: স্ট্রিং সমস্ত সাধারণ স্ট্রিং অপারেশন করার জন্য পর্যাপ্ত পদ্ধতি সরবরাহ করে না boo বৃদ্ধিতে আপনি কেবল ব্যবহার করতে পারেন boost::algorithm::contains:

#include <string>
#include <boost/algorithm/string.hpp>

int main() {
    std::string s("gengjiawen");
    std::string t("geng");
    bool b = boost::algorithm::contains(s, t);
    std::cout << b << std::endl;
    return 0;
}

32
"আমার মনে হয় std :: স্ট্রিং সমস্ত সাধারণ স্ট্রিং অপারেশন করার জন্য পর্যাপ্ত পদ্ধতি সরবরাহ করে না"। তবে findঠিক কার্যবিধিতে প্রশ্নের জন্য একটি পদ্ধতি রয়েছে। লাইব্রেরি নির্ভরতা প্রবর্তনের প্রয়োজন নেই।
স্টিফান

8
@ স্টেফান, আপনি ঠিক বলেছেন, একটি সন্ধানের পদ্ধতি রয়েছে তবে বিভাজন, প্রতিস্থাপন এবং অন্যান্য অনেক স্টাফের কী আছে You আপনি স্টাড :: স্ট্রিংটিকে জাভাতে স্ট্রিং এপি-র সাথে তুলনা করতে পারেন PS স্ট্রিংয়ে অন্য স্ট্রিং রয়েছে কিনা তা পরীক্ষা করে দেখুন।
Geng জিয়াওয়েন

1
এছাড়াও এটি সংক্ষিপ্ত এবং মেমরির পক্ষে আরও সহজ। সিপিপি 17 ফাইল সিস্টেমের জন্য সমর্থন যোগ করেছে। আমি আশা করি সিপিপি 2 এক্স স্ট্রিংয়ের জন্যও কিছু করবে। আধুনিক সিপ্পিতে এটির খুব বেদনাদায়ক অভাব বুনিয়াদি স্ট্রিং পদ্ধতি সমর্থন।
Geng Jiawen

1
আপনার কি সত্যিই "উইংস" দরকার? আমি যখন এই কোড পড়া, আমি কোন ধারণা কিনা আছে containsহয় std::containsবা boost::contains, যা একটি উল্লেখযোগ্য অসুবিধা মত মনে হয়। আমি অনুমান করি যে এসটিডি :: রয়েছে বর্তমানে বিদ্যমান নেই, তবে আমি নিশ্চিত নই যে এটি পাঠকের দ্বারা স্ট্যান্ডার্ড সমস্ত কিছু মুখস্থ করেছে ass এবং std::containsভবিষ্যতে সি ++ এর কিছু সংস্করণে খুব ভাল উপস্থিত থাকতে পারে যা এই প্রোগ্রামটি ভেঙে দেবে।
ডন হ্যাচ

12

আপনি এটি চেষ্টা করতে পারেন

string s1 = "Hello";
string s2 = "el";
if(strstr(s1.c_str(),s2.c_str()))
{
   cout << " S1 Contains S2";
}

4

ইভেন্টটিতে কার্যকারিতাটি যদি আপনার সিস্টেমে সমালোচিত হয় তবে পুরানো strstrপদ্ধতিটি ব্যবহার করা আসলে সুবিধাজনক । এর std::searchমধ্যে পদ্ধতিটি algorithmধীরতম সম্ভব। আমার অনুমান হবে যে এই পুনরাবৃত্তিগুলি তৈরি করতে অনেক সময় লাগে time

আমি কোডটি পুরো সময়ের সাথে ব্যবহার করতাম

#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <random>
#include <chrono>

std::string randomString( size_t len );

int main(int argc, char* argv[])
{
        using namespace std::chrono;

        const size_t haystacksCount = 200000;
        std::string haystacks[haystacksCount];
        std::string needle = "hello";

        bool sink = true;

        high_resolution_clock::time_point start, end;
        duration<double> timespan;

        int sizes[10] = { 10, 20, 40, 80, 160, 320, 640, 1280, 5120, 10240 };

        for(int s=0; s<10; ++s)
        {
                std::cout << std::endl << "Generating " << haystacksCount << " random haystacks of size " << sizes[s] << std::endl;
                for(size_t i=0; i<haystacksCount; ++i)
                {
                        haystacks[i] = randomString(sizes[s]);
                }

                std::cout << "Starting std::string.find approach" << std::endl;
                start = high_resolution_clock::now();
                for(size_t i=0; i<haystacksCount; ++i)
                {
                        if(haystacks[i].find(needle) != std::string::npos)
                        {
                                sink = !sink; // useless action
                        }
                }
                end = high_resolution_clock::now();
                timespan = duration_cast<duration<double>>(end-start);
                std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;

                std::cout << "Starting strstr approach" << std::endl;
                start = high_resolution_clock::now();
                for(size_t i=0; i<haystacksCount; ++i)
                {
                        if(strstr(haystacks[i].c_str(), needle.c_str()))
                        {
                                sink = !sink; // useless action
                        }
                }
                end = high_resolution_clock::now();
                timespan = duration_cast<duration<double>>(end-start);
                std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;

                std::cout << "Starting std::search approach" << std::endl;
                start = high_resolution_clock::now();
                for(size_t i=0; i<haystacksCount; ++i)
                {
                        if(std::search(haystacks[i].begin(), haystacks[i].end(), needle.begin(), needle.end()) != haystacks[i].end())
                        {
                                sink = !sink; // useless action
                        }
                }
                end = high_resolution_clock::now();
                timespan = duration_cast<duration<double>>(end-start);
                std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
        }

        return 0;
}

std::string randomString( size_t len)
{
        static const char charset[] = "abcdefghijklmnopqrstuvwxyz";
        static const int charsetLen = sizeof(charset) - 1;
        static std::default_random_engine rng(std::random_device{}());
        static std::uniform_int_distribution<> dist(0, charsetLen);
        auto randChar = [charset, &dist, &rng]() -> char
        {
                return charset[ dist(rng) ];
        };

        std::string result(len, 0);
        std::generate_n(result.begin(), len, randChar);
        return result;
}

এখানে আমি এলোমেলো উত্পন্ন haystacksএবং তাদের মধ্যে অনুসন্ধান needle। খড়ের কাটা গণনা সেট করা আছে, তবে প্রতিটি খড়ের গোড়ায় স্ট্রিংয়ের দৈর্ঘ্য শুরুতে 10 থেকে শেষ পর্যন্ত 10240 এ বৃদ্ধি করা হয়। প্রোগ্রামটি বেশিরভাগ সময় আসলে এলোমেলো স্ট্রিং উত্পন্ন করতে ব্যয় করে তবে এটি প্রত্যাশিত।

আউটপুটটি হ'ল:

Generating 200000 random haystacks of size 10
Starting std::string.find approach
Processing of 200000 elements took 0.00358503 seconds.
Starting strstr approach
Processing of 200000 elements took 0.0022727 seconds.
Starting std::search approach
Processing of 200000 elements took 0.0346258 seconds.

Generating 200000 random haystacks of size 20
Starting std::string.find approach
Processing of 200000 elements took 0.00480959 seconds.
Starting strstr approach
Processing of 200000 elements took 0.00236199 seconds.
Starting std::search approach
Processing of 200000 elements took 0.0586416 seconds.

Generating 200000 random haystacks of size 40
Starting std::string.find approach
Processing of 200000 elements took 0.0082571 seconds.
Starting strstr approach
Processing of 200000 elements took 0.00341435 seconds.
Starting std::search approach
Processing of 200000 elements took 0.0952996 seconds.

Generating 200000 random haystacks of size 80
Starting std::string.find approach
Processing of 200000 elements took 0.0148288 seconds.
Starting strstr approach
Processing of 200000 elements took 0.00399263 seconds.
Starting std::search approach
Processing of 200000 elements took 0.175945 seconds.

Generating 200000 random haystacks of size 160
Starting std::string.find approach
Processing of 200000 elements took 0.0293496 seconds.
Starting strstr approach
Processing of 200000 elements took 0.00504251 seconds.
Starting std::search approach
Processing of 200000 elements took 0.343452 seconds.

Generating 200000 random haystacks of size 320
Starting std::string.find approach
Processing of 200000 elements took 0.0522893 seconds.
Starting strstr approach
Processing of 200000 elements took 0.00850485 seconds.
Starting std::search approach
Processing of 200000 elements took 0.64133 seconds.

Generating 200000 random haystacks of size 640
Starting std::string.find approach
Processing of 200000 elements took 0.102082 seconds.
Starting strstr approach
Processing of 200000 elements took 0.00925799 seconds.
Starting std::search approach
Processing of 200000 elements took 1.26321 seconds.

Generating 200000 random haystacks of size 1280
Starting std::string.find approach
Processing of 200000 elements took 0.208057 seconds.
Starting strstr approach
Processing of 200000 elements took 0.0105039 seconds.
Starting std::search approach
Processing of 200000 elements took 2.57404 seconds.

Generating 200000 random haystacks of size 5120
Starting std::string.find approach
Processing of 200000 elements took 0.798496 seconds.
Starting strstr approach
Processing of 200000 elements took 0.0137969 seconds.
Starting std::search approach
Processing of 200000 elements took 10.3573 seconds.

Generating 200000 random haystacks of size 10240
Starting std::string.find approach
Processing of 200000 elements took 1.58171 seconds.
Starting strstr approach
Processing of 200000 elements took 0.0143111 seconds.
Starting std::search approach
Processing of 200000 elements took 20.4163 seconds.

উত্তরের সংক্ষিপ্ত সংস্করণটি হল: সি ++ এর পরিবর্তে সি ব্যবহার করা :)
r0ng

3

আপনি যদি মানক লাইব্রেরি ফাংশন ব্যবহার করতে না চান তবে নীচে একটি সমাধান রয়েছে।

#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;
}

6
আপনি ইতিমধ্যে std :: স্ট্রিং ব্যবহার করছেন, সুতরাং আপনার কোডটি ইতিমধ্যে std lib এর উপর নির্ভর করে। আমি স্টাডি :: স্ট্রিং :: সন্ধান ব্যবহার করে গৃহীত সমাধানটি এড়াতে কেন কোনও কারণ দেখছি না।
b00n12

হ্যাঁ, এটি একটি ভাল পয়েন্ট। আমি কখন এটি লিখেছি তা ভেবে দেখেনি। আমি অনুমান করি যে আমি যখন এটি লিখেছিলাম তখন কীভাবে কেবল এসটিডি :: সন্ধানটি ব্যবহার করা এড়ানো যায় সেটাই ছিল।
টেস্টিং 123

3
কেবল ভবিষ্যতের দর্শকদের জন্য: এই অ্যালগরিদমটি আসলে সঠিক নয়। কারণ "আই" কখনই ব্যর্থ সাবস্ট্রিং ম্যাচের পরে ফিরে আসে না, কিছু কিছু ক্ষেত্রে ম্যাচ হয় না, উদাহরণস্বরূপ বিবেচনা করুন: aaabc, aab
sAm_vdP

1
এটিতে বেশ কয়েকটি বাগ রয়েছে। CheckSubstring(std::string firstString, std::string secondString)উভয় স্ট্রিংই গভীরভাবে অনুলিপিগুলি ফাংশনে গিয়েছিল, যা ব্যয়বহুল particularly উপরন্তু, আপনি কল বলে CheckSubstring("XYZab", "ab\0\0")- whileলুপ তুলনা শেষ হবে aথেকে a, bথেকে b, দ্বিতীয় স্পষ্ট NUL প্রথম পংক্তির শেষে অন্তর্নিহিত NUL, তাহলে এটি প্রথম স্ট্রিং এর বাফার পরলোক পড়তে হবে, অনির্ধারিত আচরণ হচ্ছে। ব্যবহার ঠিক করতে for (... i <= ফার্স্টস্ট্রিং.সাইজ () - সেকেন্ডস্ট্রিং () আকার (); ...) `।
টনি ডেলরয়

1

যদি স্ট্রিংগুলির আকার তুলনামূলকভাবে বড় হয় (কয়েকশো বাইট বা তার বেশি) এবং সি ++ 17 উপলভ্য থাকে তবে আপনি বায়ার-মুর-হর্সপুল অনুসন্ধানকারী (সিপ্রেফারেন্স.কম থেকে উদাহরণ) ব্যবহার করতে পারেন:

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>

int main()
{
    std::string in = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,"
                     " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
    std::string needle = "pisci";
    auto it = std::search(in.begin(), in.end(),
                   std::boyer_moore_searcher(
                       needle.begin(), needle.end()));
    if(it != in.end())
        std::cout << "The string " << needle << " found at offset "
                  << it - in.begin() << '\n';
    else
        std::cout << "The string " << needle << " not found\n";
}

3
সময়ের লক্ষণ। পুরানো দিনগুলিতে কেউ কোনও অনুষ্ঠানের প্রস্তাব দিত bool contains(const std::string& haystack, const std::string& needle)। আজকাল, তারা কম্পিউটার বিজ্ঞানের মতো দেখতে আরও অস্পষ্ট কাগজের কিছু অস্পষ্ট লেখকের নামে নাম ধাঁধা টুকরো সেট দেয় ...
বিটিক্লার

0

আপনি সিস্টেমের নেমস্পেসও ব্যবহার করতে পারেন। তারপরে আপনি এতে থাকা পদ্ধতিটি ব্যবহার করতে পারেন।

#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";
    }
}

এই উত্তরটি কেবল মাইক্রোসফ্টের মালিকানাধীন সি ++ এক্সটেনশনের ক্ষেত্রে প্রযোজ্য হয় সি ++ / সিএক্স বা সি ++ / সিএলআই
এইচ। আল-আম্রি

1
হ্যাঁ, আমি দুঃখিত, আমি জানতাম না যে এটি পোস্ট করার পরে কোনও দিন পর্যন্ত এটি কেবল সেভাবেই কাজ করে।
মালিন্দু দিলানকা

-1

এটি একটি সাধারণ ফাংশন

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;
}

4
হ্যালো, তাই আপনাকে স্বাগতম। আপনি কি দয়া করে আপনার উত্তরটি সম্পাদনা করতে পারেন এবং এটি কীভাবে কাজ করে এবং এটি অন্যান্য উত্তর থেকে কীভাবে আলাদা হয় তার একটি মন্তব্য যুক্ত করতে পারেন? ধন্যবাদ!
ফ্যাবিও মনিকাকে

-1
#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's 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;
}

11
দয়া করে একটি উত্তর হিসাবে ডাম্পিং কোড এড়ানোর চেষ্টা করুন এবং এটি কী করে এবং কেন তা ব্যাখ্যা করার চেষ্টা করুন। আপনার কোডগুলি সেই ব্যক্তির পক্ষে সুস্পষ্ট নাও হতে পারে যাদের প্রাসঙ্গিক কোডিংয়ের অভিজ্ঞতা নেই। স্পষ্টতা, প্রসঙ্গ
Sᴀᴍ onᴇᴌᴀ

কোডটি পরিষ্কার করার জন্য, usingকেবলমাত্র প্রয়োজনীয় ফাংশন সহ এবং বিশ্বজগতে পুরো নামস্থান ডাম্প না করার জন্য ধন্যবাদ Thanks @ সাওনᴇᴌᴀ মন্তব্য হিসাবে, আমি অনুমান করি যে ব্যবহারকারী আপনার কোডটিতে মন্তব্যগুলি পড়েনি।
v010dya

-2

এই ওয়েবসাইটে এতগুলি উত্তর থেকে আমি একটি পরিষ্কার উত্তর খুঁজে পাইনি তাই 5-10 মিনিটের মধ্যে আমি উত্তরটি নিজেই বের করে ফেললাম। তবে এটি দুটি ক্ষেত্রে করা যেতে পারে:

  1. হয় আপনি স্ট্রিংটিতে যে সাব-স্ট্রিংয়ের সন্ধান করেছেন সেটির অবস্থান জানেন
  2. হয় আপনি অবস্থানটি জানেন না এবং এটি অনুসন্ধান করুন, চর দ্বারা চর ...

সুতরাং, এর আমরা STRING "abcde" এ সাবস্ট্রিং "সিডি" এর জন্য অনুসন্ধান অনুমান, এবং আমরা সরলতম ব্যবহার করার অনুমতি substr সি বিল্ট-ইন ফাংশন ++,

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;
}

২জনের জন্য:

#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;
}

2
8 বছর আগে পোস্ট করা শীর্ষ উত্তর ("std :: স্ট্রিং :: সন্ধান করুন") কীভাবে পরিষ্কার ছিল না?
স্টিভ স্মিথ

-3

পরিবর্তে আমরা এই পদ্ধতিটি ব্যবহার করতে পারি। আমার প্রকল্পগুলির একটি উদাহরণ। কোড উল্লেখ করুন। কিছু অতিরিক্ত এছাড়াও অন্তর্ভুক্ত করা হয়।

যদি বিবৃতি দেখুন!

/*
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 ';'s 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";
        }
    }

}

আমি দুঃখিত, আমি দেখিনি যে আমার আগে কেউ একই জিনিস পোস্ট করেছে।
মালিিন্দু দিলঙ্কা

1
"ইউটিউবে আমার সাবস্ক্রাইব করুন" স্প্যাম হিসাবে বিবেচনা করা যেতে পারে। ভবিষ্যতে এটি মনে রাখবেন দয়া করে। এছাড়াও, কীভাবে উত্তর দেওয়া যায় এবং কীভাবে স্প্যামার না হয় তা পড়ুন
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.