So sánh chuỗi không phân biệt hoa thường c#

Đề bài: So sánh hai chuỗi ký tự không phân biệt chữ hoa chữ thường (theo mã Ascii).

Đề bài này phải gọi là gần giống hệt với bài: So sánh hai chuỗi ký tự (theo mã Ascii), bạn có thể xem qua nhé (mình khuyên là nên xem qua trước 😀 ).

Cũng tương tự, chúng ta cần xét xem chuỗi thứ nhất lớn hơn, nhỏ hơn hay bằng chuỗi thứ hai.

Chỉ cần sử dụng phương thức compareToIgnoreCase()

[alert-announce]

Phương thức: public int compareToIgnoreCase(String str)

Đối số truyền vào là chuỗi String cần so sánh với chuỗi ban đầu. Phương thức trả về một trong 3 giá trị: 0, số âm, hoặc số dương.

Về cách thức hoạt động, compareToIgnoreCase() chỉ khác compareTo() ở chỗ trước khi so sánh, nó sẽ chuyển các chuỗi sang chữ thường sau đó mới thực hiện các công việc còn lại.

[/alert-announce] package com.ngockhuong.string; public class Exercise { public static void main(String[] args) { String str1 = "Chuỗi thứ 1"; String str2 = "Chuỗi thứ 2"; System.out.println("String 1: " + str1); System.out.println("String 2: " + str2); // So sánh 2 chuỗi, lưu kết quả vào biến result int result = str1.compareToIgnoreCase(str2); // Kiểm tra giá trị result if (result < 0) { System.out.println("\"" + str1 + "\"" + " nhỏ hơn " + "\"" + str2 + "\""); } else if (result == 0) { System.out.println("\"" + str1 + "\"" + " bằng " + "\"" + str2 + "\""); } else // if (result > 0) { System.out.println("\"" + str1 + "\"" + " lớn hơn " + "\"" + str2 + "\""); } } }

Kết quả

String 1: Chuỗi thứ 1 String 2: Chuỗi thứ 2 "Chuỗi thứ 1" nhỏ hơn "Chuỗi thứ 2"
  • compareToIgnoreCase() method in Java

0 0 votes

Đánh giá bài viết

so sánh 2 chuỗi
đang là chủ đề được rất nhiều mọi người tìm kiếm. Wiki19 chuyên cung cấp các thông tin thủ thuật về công nghệ mới nhất. Việc lựa chọn nguồn thông tin phù hợp chính xác trở lên hết sức khó khăn. Hôm nay https://wiki19.com/ xin giới thiệu đến các bạn [Lập trình C/C++] Bài 33. Xây dựng hàm so sánh 2 chuỗi có phân biệt hoa thường – strcmp . Cùng theo dõi ngay cách làm tại video bên dưới nhé:
– Source code: Nguyên tắc so sánh 2 chuỗi:nVí dụ: so sánh 2 chuỗi s1, s2n- Lấy từng kí tự của chuỗi s1 so sánh với từng kí tự của chuỗi s2 – nếu phát hiện sự khác biệt thì lập tức kết luậnn+ kí tự s1 lớn hơn kí tự s2n suy ra: chuỗi s1 lớn hơn chuỗi s2n+ kí tự s1 nhỏ hơn kí tự s2n suy ra: chuỗi s1 nhỏ hơn chuỗi s2n- Nếu 2 kí tự s1 và s2 bằng nhau thì tiếp tục so sánh đến khi nào gặp sự khác biệt hoặc kiểm tra hết tất cả các kí tự của 2 chuỗi mà vẫn không thấy sự khác biệt thì 2 chuỗi bằng nhaun- So sánh 2 kí tự: là đang so sánh trên mã ASCII của nó – mã ACII là 1 mã số nguyên na: 97nb: 98n…nz: 122nnA: 65nB: 66n…nZ: 90tags:strcmp, so sánh 2 chuỗi không phân biệt hoa thường, so sánh 2 chuỗi không biệt kí tự hoa thường, so sánh chuỗi lập trình, so sánh 2 chuỗi

Cảm ơn các bạn đã theo dõi hết bài viết về chủ đề [Lập trình C/C++] Bài 33. Xây dựng hàm so sánh 2 chuỗi có phân biệt hoa thường – strcmp. Rất mong các bạn hài lòng về bài viết, mọi thắc mắc xin comment xuống phía dưới. Mong các bạn ủng hộ website hơn nữa.

So sánh chuỗi không phân biệt hoa thường c#
So sánh chuỗi không phân biệt hoa thường c#
So sánh chuỗi không phân biệt hoa thường c#
So sánh chuỗi không phân biệt hoa thường c#

Rate this post



– Source code:
– Nguyên tắc so sánh 2 chuỗi:
Ví dụ: so sánh 2 chuỗi s1, s2
– Lấy từng kí tự của chuỗi s1 so sánh với từng kí tự của chuỗi s2 – nếu phát hiện sự khác biệt thì lập tức kết luận
+ kí tự s1 lớn hơn kí tự s2
suy ra: chuỗi s1 lớn hơn chuỗi s2
+ kí tự s1 nhỏ hơn kí tự s2
suy ra: chuỗi s1 nhỏ hơn chuỗi s2
– Nếu 2 kí tự s1 và s2 bằng nhau thì tiếp tục so sánh đến khi nào gặp sự khác biệt hoặc kiểm tra hết tất cả các kí tự của 2 chuỗi mà vẫn không thấy sự khác biệt thì 2 chuỗi bằng nhau
– So sánh 2 kí tự: là đang so sánh trên mã ASCII của nó – mã ACII là 1 mã số nguyên
a: 97
b: 98

z: 122

A: 65
B: 66

Z: 90

Tag: strcmp trong c++, strcmp, so sánh 2 chuỗi không phân biệt hoa thường, so sánh 2 chuỗi không biệt kí tự hoa thường, so sánh chuỗi lập trình, so sánh 2 chuỗi

Xem Thêm Bài Viết Về Công Nghệ Khác: https://chiasecongnghe.vn/cong-nghe

Nguồn: https://chiasecongnghe.vn

8/14/2008 8:01:28 PM

So sánh chuỗi không phân biệt hoa thường c#

Võ Chế Phương · Võ Chế Phương 20:01 14/08/2008

Đã đóng cửa . Câu hỏi này dựa trên ý kiến . Nó hiện không chấp nhận câu trả lời.

Đã đóng cửa 3 năm trước .

Câu trả lời của câu hỏi này là một nỗ lực của cộng đồng . Chỉnh sửa câu trả lời hiện có để cải thiện bài đăng này. Nó hiện không chấp nhận các câu trả lời hoặc tương tác mới.

Cách tốt nhất để thực hiện so sánh chuỗi không phân biệt chữ hoa chữ thường trong C ++ mà không cần biến đổi một chuỗi thành tất cả chữ hoa hoặc tất cả chữ thường là gì?

Vui lòng cho biết liệu các phương pháp này có thân thiện với Unicode hay không và mức độ linh hoạt của chúng.

372 hữu ích 4 bình luận 519k xem chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Dương Thùy Dương · Dương Thùy Dương 21:03 24/11/2008

Boost bao gồm một thuật toán tiện dụng cho việc này:

#include // Or, for fewer header dependencies: //#include std::string str1 = "hello, world!"; std::string str2 = "HELLO, WORLD!"; if (boost::iequals(str1, str2)) { // Strings are identical }

321 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Hoàng Ðình Nam · Hoàng Ðình Nam 01:36 22/05/2010

Tận dụng tiêu chuẩn char_traits. Nhớ lại rằng a std::stringtrên thực tế là một typedef cho std::basic_string, hoặc rõ ràng hơn std::basic_string >,. Các char_traitsloại mô tả cách nhân vật so sánh, làm thế nào họ sao chép, làm thế nào họ đúc vv Tất cả bạn cần làm là typedef một chuỗi mới hơn basic_string, và cung cấp cho nó với tùy chỉnh của riêng bạn char_traitsmà so sánh trường hợp insensitively.

struct ci_char_traits : public char_traits { 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 ci_string;

Chi tiết có trên Guru of The Week số 29 .

121 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Đặng Đan Khánh · Đặng Đan Khánh 21:49 07/11/2010

Vấn đề với boost là bạn phải liên kết và phụ thuộc vào boost. Không dễ dàng trong một số trường hợp (ví dụ: android).

Và việc sử dụng char_traits có nghĩa là tất cả các so sánh của bạn không phân biệt chữ hoa chữ thường, điều này thường không phải là điều bạn muốn.

Điều này là đủ. Nó phải hiệu quả một cách hợp lý. Không xử lý unicode hoặc bất cứ điều gì mặc dù.

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

Cập nhật: Bonus phiên bản C ++ 14 ( #include ):

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

98 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Phạm Quốc Hiền · Phạm Quốc Hiền 20:46 14/08/2008

Nếu bạn đang sử dụng hệ thống POSIX, bạn có thể sử dụng strcasecmp . Tuy nhiên, chức năng này không phải là một phần của tiêu chuẩn C và cũng không có sẵn trên Windows. Thao tác này sẽ thực hiện so sánh không phân biệt chữ hoa chữ thường trên các ký tự 8-bit, miễn là ngôn ngữ là POSIX. Nếu ngôn ngữ không phải là POSIX, kết quả không được xác định (vì vậy nó có thể thực hiện so sánh được bản địa hóa hoặc có thể không). Không có ký tự tương đương rộng.

Không đạt được điều đó, một số lượng lớn các triển khai thư viện C lịch sử có các hàm stricmp () và strnicmp (). Visual C ++ trên Windows đã đổi tên tất cả những thứ này bằng cách thêm dấu gạch dưới trước vì chúng không thuộc tiêu chuẩn ANSI, vì vậy trên hệ thống đó chúng được gọi là _stricmp hoặc _strnicmp . Một số thư viện cũng có thể có các hàm tương đương với ký tự rộng hoặc nhiều byte (thường được đặt tên như wcsicmp, mbcsicmp, v.v.).

Cả C và C ++ đều phần lớn không biết về các vấn đề quốc tế hóa, vì vậy không có giải pháp nào tốt cho vấn đề này, ngoại trừ việc sử dụng thư viện của bên thứ ba. Hãy xem IBM ICU (Các thành phần quốc tế cho Unicode) nếu bạn cần một thư viện mạnh mẽ cho C / C ++. ICU dành cho cả hệ thống Windows và Unix.

59 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Tạ Phi Long · Tạ Phi Long 20:31 14/08/2008

Bạn đang nói về một phép so sánh không phân biệt chữ hoa chữ thường hay một phép so sánh Unicode được chuẩn hóa đầy đủ?

So sánh ngu ngốc sẽ không tìm thấy các chuỗi có thể giống nhau nhưng không bằng nhau nhị phân.

Thí dụ:

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

Tất cả đều tương đương nhưng chúng cũng có các biểu diễn nhị phân khác nhau.

Điều đó nói rằng, Chuẩn hóa Unicode nên là bài đọc bắt buộc, đặc biệt nếu bạn có kế hoạch hỗ trợ Hangul, Thaï và các ngôn ngữ Châu Á khác.

Ngoài ra, IBM đã cấp bằng sáng chế khá nhiều cho các thuật toán Unicode được tối ưu hóa nhất và công bố chúng công khai. Họ cũng duy trì một triển khai: IBM ICU

54 hữu ích 1 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Phan Anh Thư · Phan Anh Thư 08:51 26/04/2012

boost :: iequals không tương thích với utf-8 trong trường hợp chuỗi. Bạn có thể sử dụng boost :: locale .

comparator cmpr; cout << (cmpr(str1, str2) ? "str1 < str2" : "str1 >= str2") << endl;
  • Chính - bỏ qua dấu và chữ hoa, chỉ so sánh các chữ cái cơ bản. Ví dụ "mặt tiền" và "Mặt tiền" giống nhau.
  • Phụ - bỏ qua trường hợp ký tự nhưng xem xét dấu. "mặt tiền" và "mặt tiền" khác nhau nhưng "Mặt tiền" và "mặt tiền" thì giống nhau.
  • Cấp ba - hãy xem xét cả chữ hoa và dấu: "Mặt tiền" và "mặt tiền" là khác nhau. Bỏ qua dấu chấm câu.
  • Đệ tứ - xem xét tất cả các trường hợp, trọng âm và dấu câu. Các từ phải giống nhau về cách biểu diễn Unicode.
  • Giống hệt nhau - như bậc bốn, nhưng cũng so sánh các điểm mã.

33 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Lê Đại Tú · Lê Đại Tú 11:51 26/08/2008

Suy nghĩ đầu tiên của tôi đối với một phiên bản không phải unicode là làm điều gì đó như sau:

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(static_cast(*c1)) != tolower(static_cast(*c2))) { return false; } } return true; }

31 hữu ích 4 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Hoàng Nhật Huy · Hoàng Nhật Huy 00:51 02/12/2008

Bạn có thể sử dụng strcasecmptrên Unix hoặc stricmptrên Windows.

Một điều chưa được đề cập cho đến nay là nếu bạn đang sử dụng chuỗi stl với các phương thức này, trước tiên sẽ hữu ích khi so sánh độ dài của hai chuỗi, vì thông tin này đã có sẵn cho bạn trong lớp chuỗi. Điều này có thể ngăn việc thực hiện so sánh chuỗi tốn kém nếu ngay từ đầu hai chuỗi bạn đang so sánh không có cùng độ dài.

23 hữu ích 4 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Lê Uyển Như · Lê Uyển Như 21:54 19/12/2011

Tôi đang cố gắng tập hợp một câu trả lời hay từ tất cả các bài đăng, vì vậy hãy giúp tôi chỉnh sửa điều này:

Đây là một phương pháp thực hiện việc này, mặc dù nó thực hiện chuyển đổi các chuỗi và không thân thiện với Unicode, nhưng nó phải có tính di động, đó là một điểm cộng:

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

Từ những gì tôi đã đọc, điều này dễ di động hơn stricmp () vì stricmp () trên thực tế không phải là một phần của thư viện std, mà chỉ được thực hiện bởi hầu hết các nhà cung cấp trình biên dịch.

Để có được một triển khai Unicode thực sự thân thiện, có vẻ như bạn phải đi ra ngoài thư viện std. Một thư viện tốt của bên thứ 3 là IBM ICU (Các thành phần quốc tế cho Unicode)

Ngoài ra boost :: iequals cung cấp một tiện ích khá tốt để thực hiện loại so sánh này.

15 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Trần Hoàng Điệp · Trần Hoàng Điệp 20:11 14/08/2008

Các hàm chuỗi Visual C ++ hỗ trợ unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

một trong những bạn có thể đang tìm kiếm là _wcsnicmp

14 hữu ích 1 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Dương Lan Ngọc · Dương Lan Ngọc 20:29 14/08/2008

FYI, strcmp()và stricmp()dễ bị tràn bộ đệm, vì chúng chỉ xử lý cho đến khi chạm vào dấu chấm dứt rỗng. Nó an toàn hơn để sử dụng _strncmp()và _strnicmp().

12 hữu ích 3 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Ngô Phúc Thịnh · Ngô Phúc Thịnh 09:18 05/04/2017

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

Bạn có thể sử dụng đoạn mã trên trong C ++ 14 nếu bạn không có quyền sử dụng boost. Bạn phải sử dụng std::towlowercho các ký tự rộng.

12 hữu ích 1 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Phạm Mỹ Uyên · Phạm Mỹ Uyên 21:54 16/09/2015

Xem std::lexicographical_compare:

// lexicographical_compare example #include // std::cout, std::boolalpha #include // std::lexicographical_compare #include // 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; }

Bản giới thiệu

12 hữu ích 2 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Lý Giao Kiều · Lý Giao Kiều 00:57 22/05/2010

Các Boost.String thư viện có rất nhiều thuật toán để thực hiện so sánh trường insenstive và vân vân.

Bạn có thể thực hiện của riêng bạn, nhưng tại sao phải bận tâm khi nó đã được thực hiện?

11 hữu ích 3 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Đặng Bảo Thư · Đặng Bảo Thư 15:51 30/09/2016

Ngắn gọn và hay. Không có phụ thuộc nào khác, ngoài std C lib mở rộng .

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

trả về true nếu str1và str2bằng nhau. strcasecmpcó thể không tồn tại, có thể có chất tương tự stricmp, strcmpivv

Mã ví dụ:

#include #include #include //For strcasecmp(). Also could be found in 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) <

Đầu ra:

true true true true true

11 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Trần Hồng Ngân · Trần Hồng Ngân 21:29 26/06/2013

Đối với nhu cầu so sánh chuỗi không phân biệt chữ hoa chữ thường cơ bản của tôi, tôi không muốn phải sử dụng thư viện bên ngoài, cũng như không muốn một lớp chuỗi riêng biệt với các đặc điểm không phân biệt chữ hoa chữ thường không tương thích với tất cả các chuỗi khác của tôi.

Vì vậy, những gì tôi nghĩ ra là:

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

Một hàm đơn giản với một hàm quá tải cho char và một hàm khác cho Pier_t. Không sử dụng bất kỳ thứ gì không theo tiêu chuẩn nên sẽ ổn trên mọi nền tảng.

So sánh bình đẳng sẽ không xem xét các vấn đề như mã hóa độ dài thay đổi và chuẩn hóa Unicode, nhưng basic_string không hỗ trợ cho điều đó mà tôi biết và nó thường không phải là vấn đề.

Trong trường hợp yêu cầu thao tác từ vựng phức tạp hơn đối với văn bản, thì bạn chỉ cần sử dụng thư viện của bên thứ ba như Boost.

9 hữu ích 2 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Tạ Quang Khải · Tạ Quang Khải 09:08 12/01/2016

Bạn có thể thực hiện việc này mà không sử dụng Boost bằng cách lấy con trỏ chuỗi C c_str()và sử dụng strcasecmp:

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

7 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Dương Quốc Tiến · Dương Quốc Tiến 20:10 14/08/2008

Giả sử bạn đang tìm kiếm một phương pháp chứ không phải một hàm ma thuật đã tồn tại, thành thật mà nói thì không có cách nào tốt hơn. Tất cả chúng ta đều có thể viết các đoạn mã bằng các thủ thuật thông minh cho các bộ ký tự hạn chế, nhưng vào cuối ngày, một lúc nào đó bạn phải chuyển đổi các ký tự.

Cách tiếp cận tốt nhất cho việc chuyển đổi này là thực hiện trước khi so sánh. Điều này cho phép bạn rất linh hoạt khi nói đến các lược đồ mã hóa, mà toán tử so sánh thực tế của bạn nên không biết.

Tất nhiên, bạn có thể 'ẩn' chuyển đổi này sau hàm hoặc lớp chuỗi của riêng mình, nhưng bạn vẫn cần chuyển đổi các chuỗi trước khi so sánh.

6 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Tạ Diễm Quỳnh · Tạ Diễm Quỳnh 23:32 17/11/2008

Tôi đã viết một phiên bản không phân biệt chữ hoa chữ thường của char_traits để sử dụng với std :: basic_string để tạo chuỗi std :: không phân biệt chữ hoa chữ thường khi thực hiện so sánh, tìm kiếm, v.v. bằng cách sử dụng các hàm thành viên std :: basic_string tích hợp sẵn.

Vì vậy, nói cách khác, tôi muốn làm một cái gì đó như thế này.

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

... mà std :: string không thể xử lý. Đây là cách sử dụng char_traits mới của tôi:

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

... và đây là cách triển khai:

/* --- 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 > noCaseString; A typedef is declared below which simplifies this use for chars: typedef std::basic_string > istring; --- */ template struct char_traits_nocase : public std::char_traits { 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 struct char_traits_nocase : public std::char_traits { 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 > istring; typedef std::basic_string > iwstring;

6 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Đặng Thục Oanh · Đặng Thục Oanh 20:29 14/08/2008

Tôi đã có kinh nghiệm tốt khi sử dụng các Thành phần Quốc tế cho thư viện Unicode - chúng cực kỳ mạnh mẽ và cung cấp các phương pháp để chuyển đổi, hỗ trợ ngôn ngữ, hiển thị ngày và giờ, ánh xạ trường hợp (mà bạn dường như không muốn) và đối chiếu , trong đó bao gồm so sánh không phân biệt chữ hoa chữ thường và trọng âm (và hơn thế nữa). Tôi chỉ sử dụng phiên bản C ++ của các thư viện, nhưng chúng dường như cũng có phiên bản Java.

Các phương thức tồn tại để thực hiện so sánh chuẩn hóa như được đề cập bởi @Coincoin và thậm chí có thể giải thích cho ngôn ngữ - ví dụ (và đây là một ví dụ phân loại, không hoàn toàn bình đẳng), theo truyền thống trong tiếng Tây Ban Nha (ở Tây Ban Nha), tổ hợp chữ cái "ll" sắp xếp giữa "l" và "m", do đó "lz" <"ll" <"ma".

4 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Huỳnh Hiếu Học · Huỳnh Hiếu Học 18:47 25/07/2013

Chỉ sử dụng strcmp()cho phân biệt chữ hoa chữ thường và strcmpi()hoặc stricmp()để so sánh không phân biệt chữ hoa chữ thường. Cả hai đều có trong tệp tiêu đề

định dạng:

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

Sử dụng:

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<

Đầu ra

apple và ApPlE giống nhau

a đến trước b, vì vậy táo đến trước quả bóng

4 hữu ích 3 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Hoàng Duy Thiên · Hoàng Duy Thiên 00:25 29/09/2015

Đến muộn, nhưng đây là một biến thể sử dụng std::localevà do đó xử lý chính xác tiếng Thổ Nhĩ Kỳ:

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

cung cấp cho bạn một hàm sử dụng ngôn ngữ hoạt động để chuyển đổi các ký tự thành chữ thường, sau đó bạn có thể sử dụng std::transformđể tạo các chuỗi chữ thường:

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

Điều này cũng hoạt động đối với các wchar_tchuỗi dựa trên.

3 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Võ Ngọc Huyền · Võ Ngọc Huyền 07:26 25/11/2008

Chỉ cần ghi chú về bất kỳ phương pháp nào bạn chọn cuối cùng, nếu phương pháp đó có bao gồm việc sử dụng strcmpmột số câu trả lời gợi ý:

strcmpnói chung không hoạt động với dữ liệu Unicode. Nói chung, nó thậm chí không hoạt động với các mã hóa Unicode dựa trên byte, chẳng hạn như utf-8, vì strcmpchỉ thực hiện so sánh từng byte và các điểm mã Unicode được mã hóa trong utf-8 có thể mất nhiều hơn 1 byte. Trường hợp Unicode cụ thể duy nhất strcmpđược xử lý đúng cách là khi một chuỗi được mã hóa bằng mã hóa dựa trên byte chỉ chứa các điểm mã dưới U + 00FF - khi đó so sánh byte trên mỗi byte là đủ.

2 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Nguyễn Thùy Oanh · Nguyễn Thùy Oanh 17:58 01/04/2013

Vào đầu năm 2013, dự án ICU, do IBM duy trì, là một câu trả lời khá tốt cho điều này.

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

ICU là một "thư viện Unicode hoàn chỉnh, di động theo dõi chặt chẽ các tiêu chuẩn ngành." Đối với vấn đề cụ thể về so sánh chuỗi, đối tượng Collation thực hiện những gì bạn muốn.

Dự án Mozilla đã thông qua ICU để quốc tế hóa trong Firefox vào giữa năm 2012; bạn có thể theo dõi cuộc thảo luận về kỹ thuật, bao gồm các vấn đề về hệ thống xây dựng và kích thước tệp dữ liệu, tại đây:

2 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Phạm Nguyên Hạnh · Phạm Nguyên Hạnh 19:57 26/08/2017

Có vẻ như các giải pháp trên không sử dụng phương pháp so sánh và triển khai lại tổng số nên đây là giải pháp của tôi và hy vọng nó phù hợp với bạn (Nó hoạt động tốt).

#include #include #include using namespace std; string tolow(string a) { for(unsigned int i=0;i>str1>>str2; int temp=tolow(str1).compare(tolow(str2)); if(temp>0) cout<<1; else if(temp==0) cout<<0; else cout<<-1; }

2 hữu ích 0 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Đỗ Hoài Bắc · Đỗ Hoài Bắc 21:40 26/04/2018

Nếu bạn không muốn sử dụng thư viện Boost thì đây là giải pháp cho nó chỉ bằng cách sử dụng tiêu đề io tiêu chuẩn C ++.

#include 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"<

1 hữu ích 3 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Phạm Duy An · Phạm Duy An 13:55 06/03/2015

Nếu bạn phải so sánh một chuỗi nguồn thường xuyên hơn với các chuỗi khác, một giải pháp tuyệt vời là sử dụng regex.

std::wstring first = L"Test"; std::wstring second = L"TEST"; std::wregex pattern(first, std::wregex::icase); bool isEqual = std::regex_match(second, pattern);

0 hữu ích 5 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Đặng Ðan Khanh · Đặng Ðan Khanh 09:33 18/04/2018

Một cách đơn giản để so sánh hai chuỗi trong c ++ (được thử nghiệm cho windows) là sử dụng _stricmp

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

Nếu bạn đang muốn sử dụng với std :: string, hãy lấy một ví dụ:

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

Để biết thêm thông tin tại đây: https://msdn.microsoft.com/it-it/library/e0z9k731.aspx

0 hữu ích 3 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Hoàng Mạnh Tuấn · Hoàng Mạnh Tuấn 02:40 05/03/2015

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

điều này có thể được thực hiện hiệu quả hơn nhiều, nhưng đây là một phiên bản cồng kềnh với tất cả các bit của nó.

không phải tất cả những thứ đó có thể di động, nhưng hoạt động tốt với bất kỳ thứ gì có trên máy tính của tôi (không có ý tưởng, tôi là hình ảnh chứ không phải lời nói)

-1 hữu ích 2 bình luận chia sẻ

answer

So sánh chuỗi không phân biệt hoa thường c#

Võ Bích Lam · Võ Bích Lam 14:17 12/05/2015

Một cách dễ dàng để so sánh các chuỗi chỉ khác nhau bằng ký tự viết thường và viết hoa là thực hiện so sánh ascii. Tất cả các chữ cái viết hoa và viết thường khác nhau 32 bit trong bảng ascii, sử dụng thông tin này, chúng tôi có những điều sau đây ...

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

-4 hữu ích 1 bình luận chia sẻ

Xem nguồn: https://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c

loading

loading