সি ++ এ কেস-সংবেদনশীল স্ট্রিং তুলনা [বন্ধ]


373

সমস্ত বড় হাতের বা সমস্ত ছোট হাতের স্ট্রিং রূপান্তর না করে সি ++ তে কেস-সংবেদনশীল স্ট্রিং তুলনা করার সর্বোত্তম উপায় কী?

পদ্ধতিগুলি ইউনিকোড-বান্ধব এবং সেগুলি কীভাবে বহনযোগ্য তা নির্দেশ করুন।


@ [অ্যাডাম] (# 11679): যদিও এই রূপটি ব্যবহারযোগ্যতার দিক থেকে ভাল তবে এটি কার্য সম্পাদনের দিক থেকে খারাপ কারণ এটি অপ্রয়োজনীয় অনুলিপি তৈরি করে। আমি কিছু উপেক্ষা করতে পারে তবে আমি বিশ্বাস করি সবচেয়ে ভাল (নন-ইউনিকোড) উপায় ব্যবহার করা std::stricmp। অন্যথায়, হার্বের কী বলতে হবে তা পড়ুন
কনরাড রুডল্ফ

সি-তে সাধারণত একজনকে পুরো স্ট্রিংকে তীব্রভাবে বাধ্য করা হয় তারপরে সেভাবে তুলনা করা - বা আপনার নিজের
তুলনাটি

পরবর্তী প্রশ্নটি সহজ উত্তর আছে: strcasecmp (অন্তত বাসদ ও POSIX কম্পাইলার জন্য) stackoverflow.com/questions/9182912/...
Moz

@ এমσᶎ এই প্রশ্নেরও উত্তর রয়েছে, গুরুত্বপূর্ণ ক্যাভিয়েট যা strcasecmpমানক নয় এবং কমপক্ষে একটি সাধারণ সংকলক থেকে অনুপস্থিত।
মার্ক

উত্তর:


317

বুস্ট এর জন্য একটি কার্যকরী অ্যালগরিদম অন্তর্ভুক্ত:

#include <boost/algorithm/string.hpp>
// Or, for fewer header dependencies:
//#include <boost/algorithm/string/predicate.hpp>

std::string str1 = "hello, world!";
std::string str2 = "HELLO, WORLD!";

if (boost::iequals(str1, str2))
{
    // Strings are identical
}

14
এটি কি ইউটিএফ -8 বন্ধুত্বপূর্ণ? আমি মনে করি না.
ভ্লাদর

18
না, কারণ ইউটিএফ -8 অ্যাকসেন্ট, সংমিশ্রণ, বিড়ি সমস্যা ইত্যাদির কারণে অভিন্ন স্ট্রিংগুলিকে বিভিন্ন বাইনারি কোডগুলি দিয়ে কোড করার অনুমতি দেয়
vy32

10
@ vy32 এটি একেবারেই ভুল! ইউটিএফ -8 সংমিশ্রণ পারস্পরিক একচেটিয়া। এটি সর্বদা সংক্ষিপ্ততম প্রতিনিধিত্ব ব্যবহার করা উচিত, যদি এটি না ঘটে তবে এটি একটি ত্রুটিযুক্ত ইউটিএফ -8 ক্রম বা কোড পয়েন্ট যা যত্ন সহকারে চিকিত্সা করা উচিত।
Wiz

48
@ উইজ, আপনি ইউনিকোড স্ট্রিং নরমালাইজের বিষয়টি উপেক্ষা করছেন। n একটি সংমিশ্রণ হিসাবে উপস্থাপিত হতে পারে ˜ তার পরে একটি এন, বা একটি ñ চরিত্র। তুলনা করার আগে আপনাকে ইউনিকোড স্ট্রিংয়ের নরমালাইজেশন ব্যবহার করতে হবে। দয়া করে ইউনিকোড টেকনিক্যাল রিপোর্ট # 15, ইউনিকোড.অর্গ
vy32

12
@wonkorealtime: কারণ "এস এস" বড় হাতের রূপান্তরিত হয় "এস এস": fileformat.info/info/unicode/char/df/index.htm
গরুর হাঁসের

118

স্ট্যান্ডার্ড সুবিধা নিন char_traits। মনে করে দেখুন যে একটি std::stringজন্য একটি typedef আসলে std::basic_string<char>, বা তার বেশি স্পষ্টভাবে std::basic_string<char, std::char_traits<char> >char_traitsটাইপ বর্ণনা কিভাবে অক্ষর তুলনা যে, তা কিভাবে কপি, তারা কিভাবে ইত্যাদি সমস্ত নিক্ষেপ আপনাকে যা করতে হবে একটি নতুন স্ট্রিং মধ্যে typedef শেষ হয়ে গেছে basic_string, এবং আপনার নিজস্ব সঙ্গে এটি প্রদান char_traitsকরে insensitively ক্ষেত্রে তুলনা করুন।

struct ci_char_traits : public char_traits<char> {
    static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2); }
    static bool ne(char c1, char c2) { return toupper(c1) != toupper(c2); }
    static bool lt(char c1, char c2) { return toupper(c1) <  toupper(c2); }
    static int compare(const char* s1, const char* s2, size_t n) {
        while( n-- != 0 ) {
            if( toupper(*s1) < toupper(*s2) ) return -1;
            if( toupper(*s1) > toupper(*s2) ) return 1;
            ++s1; ++s2;
        }
        return 0;
    }
    static const char* find(const char* s, int n, char a) {
        while( n-- > 0 && toupper(*s) != toupper(a) ) {
            ++s;
        }
        return s;
    }
};

typedef std::basic_string<char, ci_char_traits> ci_string;

বিশদটি ২৯ নম্বরের সপ্তাহের গুরুকে


10
আমি আমার নিজের পরীক্ষাগুলি থেকে যতদূর জানি, এটি আপনার নতুন স্ট্রিং টাইপটিকে স্ট্যান্ড :: স্ট্রিংয়ের সাথে বেমানান করে তোলে।
ঝ্যান লিংস

8
অবশ্যই এটি - তার নিজের ভালোর জন্য। কেস-সংবেদনশীল স্ট্রিং অন্যরকম: typedef std::basic_string<char, ci_char_traits<char> > istringনা typedef std::basic_string<char, std::char_traits<char> > string
আন্দ্রেয়াস স্পিন্ডার

232
"আপনাকে যা করতে হবে ..."
টিম এমবি

3
@ নাথন সম্ভবত একটি সংকলক ব্যবহার করুন যা কোডটিতে বেসিক সিএসই করতে সক্ষম ...
প্যারাম্যাগনেটিক ক্রোস্যান্ট

17
এই তুচ্ছ ঘটনায় এমন উন্মাদনা তৈরি করতে বাধ্য করে এমন কোনও ভাষা নির্মাণ করা উচিত এবং অনুশোচনা ছাড়াই পরিত্যাগ করা উচিত।
এরিক অ্যারোনস্টি

86

বুস্ট করার সাথে ঝামেলা হ'ল আপনাকে যুক্ত করতে হবে এবং বুস্টের উপর নির্ভর করতে হবে। কিছু ক্ষেত্রে সহজ নয় (যেমন অ্যান্ড্রয়েড)।

এবং চর_ট্রেট ব্যবহার করার অর্থ আপনার সমস্ত তুলনাগুলি সংবেদনশীল, যা সাধারণত আপনি চান তা নয়।

এই যথেষ্ট করা উচিত। এটি যুক্তিযুক্ত দক্ষ হওয়া উচিত। যদিও ইউনিকোড বা কিছু হ্যান্ডেল করে না।

bool iequals(const string& a, const string& b)
{
    unsigned int sz = a.size();
    if (b.size() != sz)
        return false;
    for (unsigned int i = 0; i < sz; ++i)
        if (tolower(a[i]) != tolower(b[i]))
            return false;
    return true;
}

আপডেট: বোনাস সি ++ 14 সংস্করণ ( #include <algorithm>):

bool iequals(const string& a, const string& b)
{
    return std::equal(a.begin(), a.end(),
                      b.begin(), b.end(),
                      [](char a, char b) {
                          return tolower(a) == tolower(b);
                      });
}

27
আসলে, বুস্ট স্ট্রিং লাইব্রেরি কেবল একটি শিরোনামের গ্রন্থাগার, তাই কোনও কিছুর সাথে লিঙ্ক দেওয়ার দরকার নেই। এছাড়াও, আপনি আপনার উত্স ট্রিতে স্ট্রিং শিরোনামগুলি অনুলিপি করতে বুস্টের 'বিসিপি' ইউটিলিটিটি ব্যবহার করতে পারেন, যাতে আপনার সম্পূর্ণ বুস্ট লাইব্রেরির প্রয়োজন হয় না।
গ্রেচেন

আহ আমি বিসিপি সম্পর্কে জানতাম না, এটি সত্যিই দরকারী বলে মনে হচ্ছে। তথ্যের জন্য ধন্যবাদ!
টিম্ম্ম্ম

9
একটি সাধারণ এবং অ-বুস্ট-নির্ভরতা সংস্করণটি জানা ভাল।
১:31

2
@ আন্না পাঠ্য পাঠাগারটি তৈরি এবং লিঙ্ক করা দরকার। এটি আইবিএম আইসিইউ ব্যবহার করে।
বেহরোজ.এম


58

আপনি যদি পসিক্স সিস্টেমে থাকেন তবে আপনি স্টারকেসক্যাম্প ব্যবহার করতে পারেন । এই ফাংশনটি স্ট্যান্ডার্ড সি এর অংশ নয় যদিও এটি উইন্ডোজে উপলব্ধ নয়। এটি 8-বিট চরগুলিতে কেস-সংবেদনশীল তুলনা সম্পাদন করবে, যতক্ষণ লোকেলটি পসিক্স হয়। যদি লোকেলটি পসিক্স না হয় তবে ফলাফলগুলি অনির্ধারিত হয় (যাতে এটি কোনও স্থানীয়ীকৃত তুলনা করতে পারে, নাও পারে)। বিস্তৃত অক্ষরের সমতুল্য উপলব্ধ নয়।

এটি ব্যর্থ হয়ে বিপুল সংখ্যক Cতিহাসিক সি গ্রন্থাগার বাস্তবায়নের স্ট্রাইক () এবং স্ট্রনিকম্প () রয়েছে। উইন্ডোজে ভিজ্যুয়াল সি ++ এগুলি এন্ডএসকরের সাথে উপসর্গ করে এগুলির সমস্তটির নামকরণ করেছে কারণ তারা এএনএসআই মানের অংশ নয়, সুতরাং সেই সিস্টেমে তাদের _ _ স্ট্রিম্প বা _স্ট্রিক্প বলা হয় । কিছু লাইব্রেরিতে ওয়াইড-ক্যারেক্টার বা মাল্টিবাইট সমতুল্য ফাংশন থাকতে পারে (সাধারণত নাম হিসাবে ডাব্লুসিএসসিএমপি, এমবিসিএসসিএমপি ইত্যাদি)।

সি এবং সি ++ উভয়ই আন্তর্জাতিকীকরণ সংক্রান্ত সমস্যাগুলি সম্পর্কে অজানা, সুতরাং তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করা ছাড়া এই সমস্যার কোনও ভাল সমাধান নেই। আপনার যদি সি / সি ++ এর জন্য একটি দৃ .় লাইব্রেরির প্রয়োজন হয় তবে আইবিএম আইসিইউ (ইউনিকোডের জন্য আন্তর্জাতিক উপাদানগুলি) দেখুন । আইসিইউ উইন্ডোজ এবং ইউনিক্স উভয় সিস্টেমের জন্য।


53

আপনি কি বোবা মামলার সংবেদনশীল তুলনা বা সম্পূর্ণ সাধারণীকৃত ইউনিকোড তুলনা সম্পর্কে কথা বলছেন?

একটি বোবা তুলনা স্ট্রিংগুলি একই রকম হতে পারে তবে বাইনারি সমান নয় find

উদাহরণ:

U212B (ANGSTROM SIGN)
U0041 (LATIN CAPITAL LETTER A) + U030A (COMBINING RING ABOVE)
U00C5 (LATIN CAPITAL LETTER A WITH RING ABOVE).

সমস্ত সমতুল্য তবে তাদের বিভিন্ন বাইনারি উপস্থাপনাও রয়েছে।

এটি বলেছে, ইউনিকোড নর্মালাইজেশন হ'ল বাধ্যতামূলক হওয়া উচিত বিশেষত যদি আপনি হাঙ্গুল, থা এবং অন্যান্য এশিয়ান ভাষাগুলি সমর্থন করার পরিকল্পনা করেন।

এছাড়াও, আইবিএম বেশিরভাগই অনুকূলিত ইউনিকোড অ্যালগরিদমগুলিকে পেটেন্ট করেছে এবং সেগুলি সর্বজনীনভাবে উপলভ্য করে তুলেছে। তারা একটি বাস্তবায়নও বজায় রাখে: আইবিএম আইসিইউ


2
আপনি সেই আইসিইউ লিঙ্কটি সাইট.ইকিউ
প্রজেক্ট.অর্গ.ও

31

boost :: স্ট্রিংয়ের ক্ষেত্রে iequals utf-8 সামঞ্জস্যপূর্ণ নয়। আপনি বুস্ট :: লোকেল ব্যবহার করতে পারেন ।

comparator<char,collator_base::secondary> cmpr;
cout << (cmpr(str1, str2) ? "str1 < str2" : "str1 >= str2") << endl;
  • প্রাথমিক - কেবলমাত্র বেস অক্ষরের সাথে তুলনা করে উচ্চারণ এবং চরিত্রের ক্ষেত্রে উপেক্ষা করুন। উদাহরণস্বরূপ "মুখোমুখি" এবং "ফ্যাডে" একই রকম।
  • মাধ্যমিক - চরিত্রের ক্ষেত্রে উপেক্ষা করুন তবে উচ্চারণগুলি বিবেচনা করুন। "মুখোমুখি" এবং "ফ্যাডে" আলাদা তবে "ফ্যাদে" এবং "ফ্যাডে" একই।
  • তৃতীয় - কেস এবং উচ্চারণ উভয় বিবেচনা করুন: "ফ্যাডে" এবং "ফ্যাডে" আলাদা। বিরামচিহ্ন উপেক্ষা করুন।
  • চতুর্মুখী - সমস্ত কেস, উচ্চারণ এবং বিরামচিহ্ন বিবেচনা করুন। শব্দগুলি ইউনিকোড উপস্থাপনার ক্ষেত্রে অবশ্যই অভিন্ন হতে হবে।
  • অভিন্ন - চতুর্ভুজ হিসাবে, তবে কোড পয়েন্টগুলিও তুলনা করুন

30

অ-ইউনিকোড সংস্করণটির জন্য আমার প্রথম চিন্তাটি ছিল এরকম কিছু করা:


bool caseInsensitiveStringCompare(const string& str1, const string& str2) {
    if (str1.size() != str2.size()) {
        return false;
    }
    for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) {
        if (tolower(*c1) != tolower(*c2)) {
            return false;
        }
    }
    return true;
}

20

আপনি strcasecmpইউনিক্স বা stricmpউইন্ডোজে ব্যবহার করতে পারেন ।

একটি জিনিস যা এখনও অবধি উল্লেখ করা হয়নি তা হ'ল আপনি যদি এই পদ্ধতিগুলির সাথে স্ট্রিং স্ট্রিং ব্যবহার করছেন তবে প্রথমে দুটি স্ট্রিংয়ের দৈর্ঘ্যের তুলনা করা দরকারী কারণ এই তথ্যটি স্ট্রিং ক্লাসে ইতিমধ্যে আপনার কাছে উপলভ্য। আপনি তুলনা করছেন যে দুটি স্ট্রিং প্রথম স্থানে একই দৈর্ঘ্য না থাকলে এটি ব্যয়বহুল স্ট্রিং তুলনা করতে বাধা দিতে পারে।


যেহেতু একটি স্ট্রিংয়ের দৈর্ঘ্য নির্ধারণের ক্ষেত্রে স্ট্রিংয়ের প্রতিটি চরিত্রের উপরে পুনরাবৃত্তি হয় এবং এটি 0 টির সাথে তুলনা করে, এর মধ্যে আসলেই কি এত পার্থক্য আছে এবং ঠিক এখনই স্ট্রিংগুলির তুলনা করা যায়? আমার ধারণা, উভয় স্ট্রিং মেলে না এমন ক্ষেত্রে আপনি আরও ভাল মেমরির লোকাল পাবেন তবে সম্ভবত ম্যাচের ক্ষেত্রে প্রায় 2x রানটাইম।
অদ্বিতীয় সাক্ষী

3
সি ++ ১১ উল্লেখ করে যে স্ট্যান্ড :: স্ট্রিং :: দৈর্ঘ্যের জটিলতা অবশ্যই স্থির থাকতে হবে: cplusplus.com/references/string/string/length
bradtgmurray

1
এটি একটি মজাদার ছোট ঘটনা, তবে এখানে খুব কমই রয়েছে। স্টারকেসক্যাম্প () এবং স্ট্রাইক্প () উভয়ই অজানা সি স্ট্রিং নেয়, সুতরাং কোনও স্ট্যান্ড :: স্ট্রিং জড়িত থাকে না।
uliwitness

3
আপনি "a" বনাম "আব" তুলনা করলে এই পদ্ধতিগুলি -1 ফিরে আসবে। দৈর্ঘ্য আলাদা তবে "ক" এর আগে "আব" আসে। সুতরাং, কলার অর্ডার দেওয়ার বিষয়ে যত্নশীল হলে দৈর্ঘ্যের তুলনা করা সহজ নয়।
নাথান

14

ইউনিকোড সমর্থন করে ভিজ্যুয়াল সি ++ স্ট্রিং ফাংশন: http://msdn.microsoft.com/en-us/library/cc194799.aspx

আপনি সম্ভবত যা খুঁজছেন তা হ'ল _wcsnicmp


7
হাস্যকরভাবে, মাইক্রোসফ্টের "প্রশস্ত চরিত্রের কোডগুলি" ইউনিকোড পরিষ্কার নয় কারণ তারা ইউনিকোড সাধারনকরণ পরিচালনা করে না।
vy32

13

আমি সমস্ত পোস্ট থেকে একটি ভাল উত্তর একসাথে cobble চেষ্টা করছি, তাই আমাকে এটি সম্পাদনা করতে সাহায্য করুন:

এটি করার একটি পদ্ধতি এখানে রয়েছে, যদিও এটি স্ট্রিংগুলিকে রূপান্তরিত করে, এবং ইউনিকোড বান্ধব নয়, এটি বহনযোগ্য হতে হবে যা একটি প্লাস:

bool caseInsensitiveStringCompare( const std::string& str1, const std::string& str2 ) {
    std::string str1Cpy( str1 );
    std::string str2Cpy( str2 );
    std::transform( str1Cpy.begin(), str1Cpy.end(), str1Cpy.begin(), ::tolower );
    std::transform( str2Cpy.begin(), str2Cpy.end(), str2Cpy.begin(), ::tolower );
    return ( str1Cpy == str2Cpy );
}

আমি যা পড়েছি তা থেকে স্ট্রাইক্প () এর চেয়ে বেশি বহনযোগ্য কারণ কারণ স্ট্রাইক্প () আসলে স্টাড লাইব্রেরির অংশ নয়, তবে কেবল বেশিরভাগ সংকলক বিক্রেতারা প্রয়োগ করেছেন।

সত্যিকারের ইউনিকোড বান্ধব বাস্তবায়ন পেতে এটি প্রদর্শিত হবে আপনাকে স্ট্যান্ড লাইব্রেরির বাইরে যেতে হবে। একটি ভাল তৃতীয় পক্ষের গ্রন্থাগার হ'ল আইবিএম আইসিইউ (ইউনিকোডের আন্তর্জাতিক উপাদান)

এছাড়াও বুস্ট করুন :: iequals এই ধরণের তুলনা করার জন্য যথেষ্ট ভাল ইউটিলিটি সরবরাহ করে।


আপনি দয়া করে বলতে পারেন, :: টোলভারের অর্থ কী, আপনি কেন টোলভার () এর পরিবর্তে টোলভার ব্যবহার করতে পারেন এবং '::' এর আগে কী? ধন্যবাদ
ভেক্সটোর

17
এটি খুব দক্ষ সমাধান নয় - আপনি উভয় স্ট্রিংয়ের অনুলিপি তৈরি করেন এবং প্রথম অক্ষরটি আলাদা হলেও সেগুলি সমস্তই রূপান্তর করুন।
টিম্ম্ম্ম

2
আপনি যেভাবে যাইহোক একটি অনুলিপি তৈরি করতে যাচ্ছেন, কেন রেফারেন্সের পরিবর্তে মান দ্বারা পাস করবেন না?
সেল্টিকমিনিস্ট্রেল

আমি মনে করি এটি উত্সাহ ছাড়াই সহজ টিপ। :)
সেমিক্রোমেন্স

1
প্রশ্ন transformতুলনার আগে পুরো স্ট্রিং না করার জন্য স্পষ্টভাবে জিজ্ঞাসা করে
স্যান্ডবুর্গ

12
str1.size() == str2.size() && std::equal(str1.begin(), str1.end(), str2.begin(), [](auto a, auto b){return std::tolower(a)==std::tolower(b);})

আপনি বুস্ট ব্যবহারের অবস্থানে না থাকলে আপনি উপরের কোডটি সি ++ 14 এ ব্যবহার করতে পারেন। আপনার std::towlowerপ্রশস্ত অক্ষরের জন্য ব্যবহার করতে হবে ।


4
আমি মনে করি আপনার str1.size() == str2.size() &&সামনে একটি যুক্ত করার দরকার আছে যাতে যখন str2 আরআর 1 এর উপসর্গ হয় তখন সীমা ছাড়িয়ে যায় না।
urউরোবুরɳ

11

Boost.String গ্রন্থাগার কেস-insenstive তুলনা করছেন এবং তাই জন্য আলগোরিদিম অনেক আছে।

আপনি নিজের প্রয়োগ করতে পারেন, তবে কেন এটি ইতিমধ্যে সম্পন্ন হয়ে গেলে বিরক্ত করবেন?


1
Std :: স্ট্রিং দিয়ে অন্তর্নির্মিত কোনও উপায় নেই?
উইলিয়াম কেএফ

6
না, নেই।
ডিন হার্ডিং

3
"... ইতিমধ্যে হয়ে গেলে কেন বিরক্ত করবেন?" - আপনি যদি বুস্ট ব্যবহার না করেন? ওপিতে প্রশ্নের সাথে ট্যাগ ছিল না।
jww

11

এফওয়াইআই, strcmp()এবং stricmp()বাফার ওভারফ্লোতে ঝুঁকিপূর্ণ, যেহেতু তারা একটি নাল টার্মিনেটর না আঘাত করা পর্যন্ত কেবল প্রক্রিয়া করে। এটি ব্যবহার করা নিরাপদ _strncmp()এবং _strnicmp()


6
সত্য, যদিও কোনও বাফারকে ওভাররেড করা বাফারকে ওভার রাইটিংয়ের চেয়ে উল্লেখযোগ্যভাবে কম বিপজ্জনক।
অ্যাডাম রোজেনফিল্ড

4
stricmp()এবং strnicmp()POSIX মান অংশ :-( তবে আপনি খুঁজে পেতে পারেন না strcasecmp(), strcasecmp_l(), strncasecmp()এবং strncasecmp_l()POSIX হেডারের মধ্যে strings.h:-) দেখতে opengroup.org
olibre

2
@ অ্যাডামরোসেনফিল্ড 'আরও খারাপ' প্রসঙ্গে নির্ভর করে। সুরক্ষায়, কখনও কখনও ওভাররাইটের পুরো পয়েন্টটি ওভারড্রয়েড হয়।
কর্মকাজে

10

দেখুন std::lexicographical_compare:

// lexicographical_compare example
#include <iostream>  // std::cout, std::boolalpha
#include <algorithm>  // std::lexicographical_compare
#include <cctype>  // std::tolower

// a case-insensitive comparison function:
bool mycomp (char c1, char c2) {
    return std::tolower(c1) < std::tolower(c2);
}

int main () {
    char foo[] = "Apple";
    char bar[] = "apartment";

    std::cout << std::boolalpha;

    std::cout << "Comparing foo and bar lexicographically (foo < bar):\n";

    std::cout << "Using default comparison (operator<): ";
    std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9);
    std::cout << '\n';

    std::cout << "Using mycomp as comparison object: ";
    std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9, mycomp);
    std::cout << '\n';

    return 0;
}

ডেমো


এই পদ্ধতিটি সম্ভাব্যভাবে অনিরাপদ এবং অ-বহনযোগ্য। std::tolowerঅক্ষরটি ASCII- এনকোডড হলেই কাজ করে। এর মতো কোনও গ্যারান্টি নেই std::string- সুতরাং এটি সহজেই অনির্ধারিত আচরণ হতে পারে।
প্লাজম্যাসেল

@ প্লাসম্যাসেল এর পরে এমন একটি ফাংশন ব্যবহার করুন যা ডাব্লু / অন্যান্য এনকোডিংগুলিতে কাজ করে।
ব্রায়ান রদ্রিগেজ

9

আমার মৌলিক ক্ষেত্রে সংবেদনশীল স্ট্রিং তুলনা প্রয়োজনের জন্য আমি কোনও বাহ্যিক গ্রন্থাগার ব্যবহার না করা পছন্দ করি না, বা আমার অন্য সমস্ত স্ট্রিংয়ের সাথে সঙ্গতিপূর্ণ না এমন সংবেদনশীল বৈশিষ্ট্যযুক্ত একটি পৃথক স্ট্রিং শ্রেণি চাই না।

সুতরাং আমি যা নিয়ে এসেছি তা হ'ল:

bool icasecmp(const string& l, const string& r)
{
    return l.size() == r.size()
        && equal(l.cbegin(), l.cend(), r.cbegin(),
            [](string::value_type l1, string::value_type r1)
                { return toupper(l1) == toupper(r1); });
}

bool icasecmp(const wstring& l, const wstring& r)
{
    return l.size() == r.size()
        && equal(l.cbegin(), l.cend(), r.cbegin(),
            [](wstring::value_type l1, wstring::value_type r1)
                { return towupper(l1) == towupper(r1); });
}

চরের জন্য একটি ওভারলোড এবং অন্যটি whar_t এর জন্য একটি সাধারণ ফাংশন। অ-মানক কিছু ব্যবহার করে না তাই যে কোনও প্ল্যাটফর্মে সূক্ষ্ম হওয়া উচিত।

সাম্যতার তুলনাটি ভেরিয়েবল দৈর্ঘ্য এনকোডিং এবং ইউনিকোড নরমালাইজের মতো বিষয়গুলি বিবেচনা করবে না, তবে বেসিক_স্ট্রিং এর কোনও সমর্থন নেই যে আমি যেভাবেই সচেতন এবং এটি সাধারণত কোনও সমস্যা নয়।

এমন ক্ষেত্রে যেখানে পাঠ্যের আরও পরিশীলিত লিক্সোগ্রাফিকাল হেরফের প্রয়োজন হয়, তবে আপনাকে কেবল বুস্টের মতো একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করতে হবে, যা প্রত্যাশিত।


2
আপনি সম্ভবত এটির একটি ফাংশন তৈরি করতে পারেন যদি আপনি এটি কোনও টেমপ্লেট তৈরি করেন এবং আলাদা স্ট্রিং / wstring সংস্করণের পরিবর্তে বেসিক_স্ট্রিং <T> ব্যবহার করেন?
অদ্বিতীয় সাক্ষী

2
একক ফাংশন টেম্পলেট কীভাবে স্পেশালাইজেশন বা ম্যাক্রোগুলি ব্যবহার না করেই টপার বা টাউপারকে ডাকবে, একটি ফাংশন ওভারলোড উভয়ের চেয়ে সহজ এবং আরও উপযুক্ত প্রয়োগ হিসাবে মনে হচ্ছে।
নিউট্রিনো

9

সংক্ষিপ্ত এবং সুন্দর। বর্ধিত স্টাড সি লাইব ছাড়া অন্য কোনও নির্ভরতা নেই ।

strcasecmp(str1.c_str(), str2.c_str()) == 0

আয় সত্য যদি str1এবং str2সমান। strcasecmpঅস্তিত্ব থাকতে পারে, অ্যানালগ থাকতে পারে stricmp,strcmpi ইত্যাদি

উদাহরণ কোড:

#include <iostream>
#include <string>
#include <string.h> //For strcasecmp(). Also could be found in <mem.h>

using namespace std;

/// Simple wrapper
inline bool str_ignoreCase_cmp(std::string const& s1, std::string const& s2) {
    if(s1.length() != s2.length())
        return false;  // optimization since std::string holds length in variable.
    return strcasecmp(s1.c_str(), s2.c_str()) == 0;
}

/// Function object - comparator
struct StringCaseInsensetiveCompare {
    bool operator()(std::string const& s1, std::string const& s2) {
        if(s1.length() != s2.length())
            return false;  // optimization since std::string holds length in variable.
        return strcasecmp(s1.c_str(), s2.c_str()) == 0;
    }
    bool operator()(const char *s1, const char * s2){ 
        return strcasecmp(s1,s2)==0;
    }
};


/// Convert bool to string
inline char const* bool2str(bool b){ return b?"true":"false"; }

int main()
{
    cout<< bool2str(strcasecmp("asd","AsD")==0) <<endl;
    cout<< bool2str(strcasecmp(string{"aasd"}.c_str(),string{"AasD"}.c_str())==0) <<endl;
    StringCaseInsensetiveCompare cmp;
    cout<< bool2str(cmp("A","a")) <<endl;
    cout<< bool2str(cmp(string{"Aaaa"},string{"aaaA"})) <<endl;
    cout<< bool2str(str_ignoreCase_cmp(string{"Aaaa"},string{"aaaA"})) <<endl;
    return 0;
}

আউটপুট:

true
true
true
true
true

6
আশ্চর্যজনক যে সি ++ স্টেড :: স্ট্রিংয়ের কোনও উপেক্ষা-কেস তুলনা পদ্ধতি নেই ..
kyb

1
"স্টারকেসক্যাম্প স্ট্যান্ডার্ডের অংশ নয়" - মার্ক রান্সম 1 ডিসেম্বর '14 এ 19:57
লিভিউ

হ্যাঁ, তবে আধুনিক সংকলকগুলির বেশিরভাগের কাছে এটি বা এর অন্য নামযুক্ত এনালগ রয়েছে। stricmp, strcmpi, strcasecmp, ইত্যাদি আপনাকে ধন্যবাদ। বার্তা সম্পাদিত।
kyb

টুডো: cout << boolalphaআমার চেয়ে বরং ব্যবহার করুন bool2strকারণ এটি স্পষ্টতই স্রোতের জন্য চুলে বর্ণকে রূপান্তরিত করে।
কিয়ব

এটি জিসিসির লাইব্রেরিতে <স্ট্রিংস h> এ।
পেঁচা

7

বুস্ট ব্যবহার না করে এটি করা সি স্ট্রিং পয়েন্টারটি পেয়ে c_str()এবং ব্যবহার করে করা যেতে পারে strcasecmp:

std::string str1 ="aBcD";
std::string str2 = "AbCd";;
if (strcasecmp(str1.c_str(), str2.c_str()) == 0)
{
    //case insensitive equal 
}

6

ধরে নিই যে আপনি ইতিমধ্যে বিদ্যমান এমন কোনও যাদু ফাংশন নয় এমন কোনও পদ্ধতি খুঁজছেন, এর থেকে আরও ভাল উপায় আর নেই। সীমিত অক্ষর সেটগুলির জন্য আমরা সকলেই কোড স্নিপেটগুলি চতুর কৌশল সহ লিখতে পারি, তবে দিনের শেষে আপনাকে কোনও অক্ষর রূপান্তর করতে হয়।

এই রূপান্তরটির জন্য সর্বোত্তম পদ্ধতির তুলনা করার আগে তা করা। এনকোডিং স্কিমগুলির ক্ষেত্রে এটি আপনাকে নমনীয়তার সুযোগ দেয় যা আপনার প্রকৃত তুলনা অপারেটরকে অবহেলা করা উচিত।

আপনি অবশ্যই আপনার নিজের স্ট্রিং ফাংশন বা শ্রেণীর পিছনে এই রূপান্তরটি 'আড়াল' করতে পারেন, তবে আপনাকে তুলনার আগে স্ট্রিংগুলিকে রূপান্তর করতে হবে।


6

Std :: বেসিক_স্ট্রিংয়ের সাথে ব্যবহারের জন্য Char_traits এর কেস-সংবেদনশীল সংস্করণ লিখেছিলাম একটি std :: স্ট্রিং তৈরি করার জন্য যা বিল্ট-ইন std :: বেসিক_স্ট্রিং সদস্য ফাংশনগুলি ব্যবহার করে তুলনা, অনুসন্ধান ইত্যাদির ক্ষেত্রে ক্ষেত্রে সংবেদনশীল নয়।

সুতরাং অন্য কথায়, আমি এই জাতীয় কিছু করতে চেয়েছিলাম।

std::string a = "Hello, World!";
std::string b = "hello, world!";

assert( a == b );

... যা স্ট্যান্ড :: স্ট্রিং হ্যান্ডেল করতে পারে না। এখানে আমার নতুন চর_ট্রাটের ব্যবহার রয়েছে:

std::istring a = "Hello, World!";
std::istring b = "hello, world!";

assert( a == b );

... এবং বাস্তবায়ন এখানে:

/*  ---

        Case-Insensitive char_traits for std::string's

        Use:

            To declare a std::string which preserves case but ignores case in comparisons & search,
            use the following syntax:

                std::basic_string<char, char_traits_nocase<char> > noCaseString;

            A typedef is declared below which simplifies this use for chars:

                typedef std::basic_string<char, char_traits_nocase<char> > istring;

    --- */

    template<class C>
    struct char_traits_nocase : public std::char_traits<C>
    {
        static bool eq( const C& c1, const C& c2 )
        { 
            return ::toupper(c1) == ::toupper(c2); 
        }

        static bool lt( const C& c1, const C& c2 )
        { 
            return ::toupper(c1) < ::toupper(c2);
        }

        static int compare( const C* s1, const C* s2, size_t N )
        {
            return _strnicmp(s1, s2, N);
        }

        static const char* find( const C* s, size_t N, const C& a )
        {
            for( size_t i=0 ; i<N ; ++i )
            {
                if( ::toupper(s[i]) == ::toupper(a) ) 
                    return s+i ;
            }
            return 0 ;
        }

        static bool eq_int_type( const int_type& c1, const int_type& c2 )
        { 
            return ::toupper(c1) == ::toupper(c2) ; 
        }       
    };

    template<>
    struct char_traits_nocase<wchar_t> : public std::char_traits<wchar_t>
    {
        static bool eq( const wchar_t& c1, const wchar_t& c2 )
        { 
            return ::towupper(c1) == ::towupper(c2); 
        }

        static bool lt( const wchar_t& c1, const wchar_t& c2 )
        { 
            return ::towupper(c1) < ::towupper(c2);
        }

        static int compare( const wchar_t* s1, const wchar_t* s2, size_t N )
        {
            return _wcsnicmp(s1, s2, N);
        }

        static const wchar_t* find( const wchar_t* s, size_t N, const wchar_t& a )
        {
            for( size_t i=0 ; i<N ; ++i )
            {
                if( ::towupper(s[i]) == ::towupper(a) ) 
                    return s+i ;
            }
            return 0 ;
        }

        static bool eq_int_type( const int_type& c1, const int_type& c2 )
        { 
            return ::towupper(c1) == ::towupper(c2) ; 
        }       
    };

    typedef std::basic_string<char, char_traits_nocase<char> > istring;
    typedef std::basic_string<wchar_t, char_traits_nocase<wchar_t> > iwstring;

1
এটি নিয়মিত চরিত্রের জন্য কাজ করে, তবে সমস্ত ইউনিকোডের জন্য কাজ করবে না, কারণ ক্যাপিটালাইজেশন অবিচ্ছেদ্য দ্বিপাক্ষিক নয় (গ্রীক ভাষায় সিগমা জড়িত থাকার একটি ভাল উদাহরণ রয়েছে যা আমি এই মুহূর্তে মনে করতে পারি না; এটির মতো দুটি নিম্ন এবং একটি উচ্চতর ক্ষেত্রে রয়েছে) , এবং আপনি উভয় উপায়ে সঠিক তুলনা করতে পারবেন না)
কপপ্রো

1
এটি সত্যিই এটি ভুল উপায়। কেস সংবেদনশীলতা স্ট্রিংগুলির নিজস্ব হওয়া উচিত নয়। একই স্ট্রিং অবজেক্টে কেস-সংবেদনশীল এবং কেস সংবেদনশীল উভয়ের তুলনা প্রয়োজন হলে কী হয়?
ফেরুকসিও 21

যদি কেস-সংবেদনশীলতা স্ট্রিংয়ের "অংশ" হওয়ার পক্ষে উপযুক্ত না হয়, তবে উভয়ই ফাইন্ড () ফাংশনটি নয়। যা আপনার পক্ষে সত্য হতে পারে এবং তা ঠিক আছে। আইএমও সি ++ সম্পর্কে সর্বাধিক বড় বিষয় হ'ল এটি প্রোগ্রামারটিতে কোনও নির্দিষ্ট দৃষ্টান্ত জোর করে না। এটি যা আপনি চান / এটি হওয়া দরকার।
জন ডিবলিং

প্রকৃতপক্ষে, আমি মনে করি বেশিরভাগ সি ++ - গুরুর (স্ট্যান্ডার্ড কমিটির সদস্যদের মতো) সম্মত হন যে স্ট্যান্ড :: বেসিক_স্ট্রিং <> এর সাথে অনেকগুলি অন্যান্য জিনিস যা সমানভাবে ভালভাবে স্থাপন করা যেতে পারে তার সাথে খুঁজে পাওয়া ভুল ছিল was বিনামূল্যে ফাংশন। এটি টাইপ করা সঙ্গে কিছু সমস্যা আছে।
আন্দ্রেয়াস ম্যাগনুসন

অন্যরা যেমন উল্লেখ করেছে, এই সমাধানটিতে দু'টি বড় বিষয় ভুল রয়েছে (হাস্যকরভাবে, একটি হল ইন্টারফেস এবং অন্যটি বাস্তবায়ন ;-))।
কনরাড রুডল্ফ

4

ইউনিকোড লাইব্রেরিগুলির জন্য আন্তর্জাতিক উপাদানগুলি ব্যবহার করে আমার বেশ ভাল অভিজ্ঞতা হয়েছে - এগুলি অত্যন্ত শক্তিশালী এবং রূপান্তরকরণ, স্থানীয় সহায়তা, তারিখ এবং সময় রেন্ডারিং, কেস ম্যাপিং (যা আপনি চান না বলে মনে হয়) এবং জোটের জন্য পদ্ধতি সরবরাহ করে , যার মধ্যে কেস- এবং অ্যাকসেন্ট-সংবেদনশীল তুলনা (এবং আরও) অন্তর্ভুক্ত রয়েছে। আমি কেবল গ্রন্থাগারগুলির সি ++ সংস্করণ ব্যবহার করেছি, তবে তাদের জাভা সংস্করণও রয়েছে বলে মনে হয়।

@Coincoin দ্বারা উল্লিখিত হিসাবে সাধারণ তুলনাগুলি সম্পাদন করার পদ্ধতিগুলি বিদ্যমান এবং উদাহরণস্বরূপ স্প্যানিশ (স্পেনে) চিঠির সংমিশ্রণ "এলএল" এর মধ্যে বর্ণের সংমিশ্রণ "এলএল" এর মধ্যে বাছাই করে - উদাহরণস্বরূপ (এবং এটি একটি বাছাই উদাহরণ, কঠোরভাবে সমতা নয়)। "l" এবং "m", সুতরাং "lz" <"ll" <"মা"।


4

strcmp()সংবেদনশীল ক্ষেত্রে strcmpi()বা stricmp()ক্ষেত্রে সংবেদনশীল তুলনার জন্য কেবল ব্যবহার করুন । যা উভয়ই শিরোলেখ ফাইলটিতে রয়েছে<string.h>

বিন্যাস:

int strcmp(const char*,const char*);    //for case sensitive
int strcmpi(const char*,const char*);   //for case insensitive

ব্যবহার:

string a="apple",b="ApPlE",c="ball";
if(strcmpi(a.c_str(),b.c_str())==0)      //(if it is a match it will return 0)
    cout<<a<<" and "<<b<<" are the same"<<"\n";
if(strcmpi(a.c_str(),b.c_str()<0)
    cout<<a[0]<<" comes before ball "<<b[0]<<", so "<<a<<" comes before "<<b;

আউটপুট

আপেল এবং অ্যাপপ্লাই একই রকম

একটি খ আগে আসে, তাই আপেল বল আগে আসে


2
ডাউনভোট কারণ এটি কার্যকরী করার জন্য খুব কমই একটি সি ++ উপায়।
থমাস ডোগার্ড

এটি আমার বিশ্ববিদ্যালয়ের সি ++ কনভেনশন তবে এখানে পোস্ট করার সময় আমি এটি মনে
রাখব

4
স্ট্রিম্প একটি মাইক্রোসফ্ট এক্সটেনশন আফাইক AI পরিবর্তে BSD এর কাছে স্টারকেসক্যাম্প () রয়েছে বলে মনে হচ্ছে।
অবিবাহিত

3

পার্টিতে দেরীতে, তবে এখানে একটি রূপ রয়েছে যা ব্যবহার করে std::localeএবং তুর্কি সঠিকভাবে পরিচালনা করে:

auto tolower = std::bind1st(
    std::mem_fun(
        &std::ctype<char>::tolower),
    &std::use_facet<std::ctype<char> >(
        std::locale()));

অক্ষরকে ছোট হাতের অক্ষরে রূপান্তর করতে সক্রিয় লোকেল ব্যবহার করে এমন একটি ফান্টর আপনাকে দেয় যা আপনি তারপরে std::transformলোয়ার-কেস স্ট্রিংগুলি তৈরি করতে ব্যবহার করতে পারেন :

std::string left = "fOo";
transform(left.begin(), left.end(), left.begin(), tolower);

এটি wchar_tবেসড স্ট্রিংয়ের জন্যও কাজ করে।


2

আপনি অবশেষে যে কোনও পদ্ধতি বেছে নেবেন সে সম্পর্কে কেবলমাত্র একটি নোট, যদি সেই পদ্ধতির ব্যবহার অন্তর্ভুক্ত হয় strcmp কিছু উত্তর তবে:

strcmpসাধারণভাবে ইউনিকোড ডেটা নিয়ে কাজ করে না। সাধারণভাবে, এটি বাইট-ভিত্তিক ইউনিকোড এনকোডিংগুলি যেমন ইউটিএফ -8 এর সাথেও কাজ করে না, যেহেতু strcmpকেবল বাই-প্রতি-বাইট তুলনা করা হয় এবং ইউটিএফ -8 এ এনকোডযুক্ত ইউনিকোড কোড পয়েন্টগুলি 1 বাইটের বেশি নিতে পারে। একমাত্র নির্দিষ্ট ইউনিকোড strcmpকেসটি সঠিকভাবে হ্যান্ডেল করা হয় যখন বাইট-ভিত্তিক এনকোডিং সহ একটি স্ট্রিংয়ে ইউ + 00FF এর নীচে কেবল কোড পয়েন্ট থাকে - তবে বাইট-প্রতি-বাইট তুলনা যথেষ্ট।


2

২০১৩ সালের গোড়ার দিকে, আইবিইউ প্রকল্পটি, আইবিএম দ্বারা পরিচালিত, এটির পক্ষে বেশ ভাল উত্তর।

http://site.icu-project.org/

আইসিইউ একটি "সম্পূর্ণ, পোর্টেবল ইউনিকোড লাইব্রেরি যা শিল্পের মানগুলি ঘনিষ্ঠভাবে ট্র্যাক করে।" স্ট্রিং তুলনার নির্দিষ্ট সমস্যার জন্য, কোলেশন অবজেক্টটি আপনি যা চান তা করে।

মোজিলা প্রকল্পটি ২০১২ সালের মাঝামাঝি ফায়ারফক্সে আন্তর্জাতিককরণের জন্য আইসিইউ গ্রহণ করেছে; আপনি এখানে বিল্ডিং সিস্টেম এবং ডেটা ফাইলের আকারের বিষয়গুলি সহ ইঞ্জিনিয়ারিং আলোচনাকে ট্র্যাক করতে পারেন:


2

দেখে মনে হচ্ছে উপরের সমাধানগুলি তুলনা পদ্ধতিটি ব্যবহার করে আবার মোট প্রয়োগ করছে না তাই এখানে আমার সমাধান এবং আশা করি এটি আপনার পক্ষে কাজ করে (এটি ভাল কাজ করছে)।

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
string tolow(string a)
{
    for(unsigned int i=0;i<a.length();i++)
    {
        a[i]=tolower(a[i]);
    }
    return a;
}
int main()
{
    string str1,str2;
    cin>>str1>>str2;
    int temp=tolow(str1).compare(tolow(str2));
    if(temp>0)
        cout<<1;
    else if(temp==0)
        cout<<0;
    else
        cout<<-1;
}

1

আপনি যদি বুস্ট লাইব্রেরিটি ব্যবহার করতে না চান তবে কেবলমাত্র সি ++ স্ট্যান্ডার্ড আইও শিরোলেখ ব্যবহার করে এর সমাধান এখানে দেওয়া হল।

#include <iostream>

struct iequal
{
    bool operator()(int c1, int c2) const
    {
        // case insensitive comparison of two characters.
        return std::toupper(c1) == std::toupper(c2);
    }
};

bool iequals(const std::string& str1, const std::string& str2)
{
    // use std::equal() to compare range of characters using the functor above.
    return std::equal(str1.begin(), str1.end(), str2.begin(), iequal());
}

int main(void)
{
    std::string str_1 = "HELLO";
    std::string str_2 = "hello";

    if(iequals(str_1,str_2))
    {
        std::cout<<"String are equal"<<std::endl;   
    }

    else
    {
        std::cout<<"String are not equal"<<std::endl;
    }


    return 0;
}

আমি বিশ্বাস করি যে স্টাডি :: টুপারটি # অন্তর্ভুক্ত <সিক্ট টাইপ> এ রয়েছে, আপনার এটি অন্তর্ভুক্ত করার প্রয়োজন হতে পারে।
ডেভিড লেজার

আপনি যদি এর মতো বিশ্বব্যাপী সংস্করণ ব্যবহার করেন: টুপার তখন আপনার <ctype> অন্তর্ভুক্ত করার দরকার নেই কারণ লোকেল আমার অনুমান সহ দুটি সংস্করণ সি সংস্করণ এবং সি ++ সংস্করণ রয়েছে। তাই বিশ্বব্যাপী সংস্করণ "::
স্পর্শক

এই সমাধানটি ব্যর্থ হয় যখন কোনও একটি স্ট্রিং ফাঁকা থাকে: "" - এটি মিথ্যা ফিরতে হবে এমন ক্ষেত্রে এটি সত্য হয়
এক্কিস

0

যদি আপনার উত্সের স্ট্রিংকে প্রায়শই অন্যান্য স্ট্রিংয়ের সাথে তুলনা করতে হয় তবে একটি মার্জিত সমাধান হ'ল রেজেক্স ব্যবহার করা।

std::wstring first = L"Test";
std::wstring second = L"TEST";

std::wregex pattern(first, std::wregex::icase);
bool isEqual = std::regex_match(second, pattern);

এই কিন্তু কম্পাইল ত্রুটি চেষ্টা: error: conversion from 'const char [5]' to non-scalar type 'std::wstring {aka std::basic_string<wchar_t>}' requested
Deqing

খারাপ ধারণা এটি সবচেয়ে খারাপ সমাধান।
Behrouz.M

এটি কোনও ভাল সমাধান নয়, তবে আপনি এটি ব্যবহার করতে চাইলেও আপনার প্রশস্ত চৌকির সামনে যেমন এল প্রয়োজন, যেমন এল "টেস্ট"
সেলটিকমিনিস্ট্রেল

এটির সবচেয়ে খারাপ সমাধান কেন কেউ ব্যাখ্যা করতে পারলে ভালো হবে। পারফরম্যান্স সমস্যা কারণ? রেজেক্স তৈরি করা ব্যয়বহুল, তবে এর পরে তুলনাটি সত্যই দ্রুত হওয়া উচিত।
স্মিখ করুন

এটি ব্যবহারযোগ্য এবং পোর্টেবল, বড় সমস্যাটি হ'ল প্রথমে কোনও চরিত্র যা রেজেক্স ব্যবহার করে তা ধারণ করতে পারে না। এটির কারণে এটি সাধারণ স্ট্রিং তুলনা হিসাবে ব্যবহার করা যায় না। এটি ধীরে ধীরেও হবে, স্মিবি যেমন বলছে ঠিক তেমনভাবে কাজ করার জন্য একটি পতাকা রয়েছে তবে এখনও সাধারণ ফাংশন হিসাবে ব্যবহার করা যায় না।
বেন

0

দুটি স্ট্রিং সি ++ (উইন্ডোজের জন্য পরীক্ষিত) সাথে তুলনা করার একটি সহজ উপায় _ স্ট্রিক্প ব্যবহার করছে

// Case insensitive (could use equivalent _stricmp)  
result = _stricmp( string1, string2 );  

আপনি যদি std :: স্ট্রিং ব্যবহার করতে চান তবে একটি উদাহরণ:

std::string s1 = string("Hello");
if ( _stricmp(s1.c_str(), "HELLO") == 0)
   std::cout << "The string are equals.";

আরও তথ্যের জন্য এখানে: https://msdn.microsoft.com/it-it/library/e0z9k731.aspx


এই উত্তরের পাশাপাশি স্ট্যাকওভারফ্লো . com/ a/ 12414441/95309 পড়ার পক্ষে এটি একটি ক) একটি সি ফাংশন, এবং খ) সম্ভবত বহনযোগ্য নয়।
ক্লজ জর্জেনসেন

এই কাজটি করার জন্য আমাদের কী # অন্তর্ভুক্ত দরকার?
এক্কিস

1
আপনি এখানে পড়তে পারেন এমন @ স্ট্রিম্প ব্যবহারের জন্য_ইকিস্কি আপনাকে <স্ট্রিং.এইচ> অন্তর্ভুক্ত করতে হবে: ডকস.মাইক্রোসফটকম
en-

-1
bool insensitive_c_compare(char A, char B){
  static char mid_c = ('Z' + 'a') / 2 + 'Z';
  static char up2lo = 'A' - 'a'; /// the offset between upper and lowers

  if ('a' >= A and A >= 'z' or 'A' >= A and 'Z' >= A)
      if ('a' >= B and B >= 'z' or 'A' >= B and 'Z' >= B)
      /// check that the character is infact a letter
      /// (trying to turn a 3 into an E would not be pretty!)
      {
        if (A > mid_c and B > mid_c or A < mid_c and B < mid_c)
        {
          return A == B;
        }
        else
        {
          if (A > mid_c)
            A = A - 'a' + 'A'; 
          if (B > mid_c)/// convert all uppercase letters to a lowercase ones
            B = B - 'a' + 'A';
          /// this could be changed to B = B + up2lo;
          return A == B;
        }
      }
}

এটি সম্ভবত আরও বেশি দক্ষ করে তোলা যেতে পারে তবে এখানে তার সমস্ত বিট খালি একটি ভারী সংস্করণ রয়েছে।

সমস্ত পোর্টেবল নয়, তবে আমার কম্পিউটারে যা আছে তা দিয়ে ভাল কাজ করে (কোনও ধারণা নেই, আমি ছবিতে শব্দ নই)


এটি ইউনিকোড সমর্থন নয় যা এই প্রশ্নটিই জিজ্ঞাসা করেছিল।
Behrouz.M

এটি অ-ইংরাজী অক্ষর সেটগুলি সমর্থন করে না।
রবার্ট আন্দ্রেজুক

-3

ছোট হাতের অক্ষর এবং মূলধন অক্ষর দ্বারা পৃথক পৃথক স্ট্রিংগুলির তুলনা করার একটি সহজ উপায় একটি আসকি তুলনা করা। সমস্ত মূলধন এবং ছোট হাতের অক্ষরগুলি ascii টেবিলের 32 টি বিটের দ্বারা পৃথক হয়, আমাদের কাছে নিম্নলিখিত তথ্যটি ব্যবহার করে ...

    for( int i = 0; i < string2.length(); i++)
    {
       if (string1[i] == string2[i] || int(string1[i]) == int(string2[j])+32 ||int(string1[i]) == int(string2[i])-32) 
    {
      count++;
      continue;
    }
    else 
    {
      break;
    }
    if(count == string2.length())
    {
      //then we have a match
    }
}

3
এর মতে, "++ j" "KKJ" এর সমান এবং "1234" "QRST" এর সমান পাওয়া যাবে। আমি সন্দেহ করি যে কেউ চায় এমন কিছু।
সেল্টিকমিনিস্ট্রেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.