Diễn Đàn

Lớp chuỗi Mac C ++ - so sánh chữ hoa và chữ thường?

NS

tan chảy

Áp phích gốc
Ngày 4 tháng 12 năm 2006
Katy, Texas
  • Ngày 8 tháng 6 năm 2007
Tôi đã xem trong tài liệu tham khảo trực tuyến (cppreference.com) và sách C ++ của mình, nhưng tôi không thể tìm thấy chuỗi so sánh không nhạy cảm (). Chắc chắn có các so sánh không phân biệt chữ hoa chữ thường trong C-String, nhưng tôi muốn sử dụng so sánh C ++ nếu có.

(Thêm nữa, bây giờ tôi đang làm nhiệm vụ tìm ra nó ...)

Cảm ơn, Todd NS

tan chảy

Áp phích gốc
Ngày 4 tháng 12 năm 2006


Katy, Texas
  • Ngày 8 tháng 6 năm 2007
Tôi đoán tôi có thể sử dụng một bộ bit HOẶC với một chuỗi dài hơn tôi cần đã biết của tất cả các ô trống (X'20 ') và sau đó kiểm tra so sánh chữ thường ...

tôi hiểu rồi

Ngày 25 tháng 10 năm 2004
  • Ngày 8 tháng 6 năm 2007
Nó gần như vượt quá sự tin tưởng, nhưng tôi không tin rằng thư viện C ++ tiêu chuẩn có phân biệt chữ hoa chữ thường.

Nếu bạn không muốn hoặc không cần phải lo lắng về ngôn ngữ, hãy:
_stricmp (str1.c_str (), str2.c_str ())
Là giải pháp đơn giản nhất (cũng khá hiệu quả).

Miền địa phương làm phức tạp mọi thứ một chút (tốt, đó thực sự là những thiếu sót của thư viện tiêu chuẩn khiến điều này trở nên phức tạp).
Hãy xem liệu tôi có thể tìm thấy một liên kết cho một cái gì đó liên quan đến ngôn ngữ ...
đây là một: http://lafstern.org/matt/col2_new.pdf
Tôi không biết liệu anh ấy có thực sự biết mình đang nói gì không, nhưng có vẻ như anh ấy biết. Anh ấy tiếp tục một lúc về vấn đề này để bạn có thể hiểu vấn đề, nhưng bạn có thể bỏ qua phần cuối và kiểm tra khối mã cuối cùng để biết giải pháp tốt nhất của anh ấy. NS

tan chảy

Áp phích gốc
Ngày 4 tháng 12 năm 2006
Katy, Texas
  • Ngày 9 tháng 6 năm 2007
Cảm ơn iSee. Vâng, anh ấy có thể đúng. Tuy nhiên, vì mục đích của tôi, tôi sẽ làm việc với mã ký tự ASCII 7-bit và tôi nghĩ đoạn mã này sẽ đủ tốt.

Cảm ơn vì đã xác nhận - rất vui khi thấy tôi đã không bỏ lỡ nó.

Todd

Mã: #include #include using namespace std ; bool case_insensitive_compare( string a, string b) { char char1, char2, blank = ' ' ; int len1 = a.length() ; int len2 = b.length() ; for (int i = 0 ; i input ; result = case_insensitive_compare(input, hello) ; std::cout << 'Result of compare of ' << input << ' to ' << hello << ' is ' << (result ? 'true' : 'false' ) << endl ; return 0; } NS

tan chảy

Áp phích gốc
Ngày 4 tháng 12 năm 2006
Katy, Texas
  • Ngày 10 tháng 6 năm 2007
iSee đã nói: Nếu bạn không muốn hoặc không cần phải lo lắng về ngôn ngữ, thì:
_stricmp (str1.c_str (), str2.c_str ())
Là giải pháp đơn giản nhất (cũng khá hiệu quả).

Được tôi từ bỏ. Bạn đã nghĩ ra ở đâu _stricmp ?

Todd TRONG

wittegijt

Ngày 18 tháng 2 năm 2007
Eindhoven
  • Ngày 11 tháng 6 năm 2007
toddburch nói: OK, tôi từ bỏ. Bạn đã nghĩ ra ở đâu _stricmp ?

Todd

Đó là một thứ của Windows. Thư viện Unix sử dụng strcasecmp, nó ở trong.

Wittegijt.

tôi hiểu rồi

Ngày 25 tháng 10 năm 2004
  • Ngày 11 tháng 6 năm 2007
toddburch nói: OK, tôi từ bỏ. Bạn đã nghĩ ra ở đâu _stricmp ?

Todd

OK, xin lỗi vì đã ném nó ra khỏi đó.

Tôi nghĩ nó là một phần của thư viện C tiêu chuẩn, nhưng không phải vậy. Nó chỉ xuất hiện, không chính thức, dưới các tên khác nhau, trong các triển khai khác nhau của thư viện C. Vì vậy, so sánh không phân biệt chữ hoa chữ thường cũng không phải là một phần chính thức của thư viện C chính thức. Geeze. Đó dường như là một thiếu sót rất lớn. Trong VS, nó là _stricmp () hoặc stricmp (), trong CodeWarrior cho Mac là stricmp () hoặc strcasecmp () và trong OS X 10.4 / Xcode là strcasecmp ().

Nghĩ lại thì, dấu gạch dưới hàng đầu lẽ ra phải cho tôi gợi ý.

Tôi đoán nếu bạn muốn phù hợp với tiêu chuẩn C, bạn phải triển khai của riêng bạn bằng cách sử dụng tolower () (hoặc toupper ()) trong một vòng lặp.

Hãy xem một lần vượt qua đầu tiên có thể là (Đây là điều tôi nghĩ, KHÔNG PHẢI là mã được kiểm tra):
Mã: #include ... int mystricmp(const char* str1, const char* str2) { if (str1 == str2) return 0; else if (str1 == NULL) return -1; else if (str2 == NULL) return 1; else { while (tolower(*str1) == tolower(*str2) && *str1 != 0 && *str2 != 0) { ++str1; ++str2; } if (*str1 *str2) return 1; else return 0; } }
Dù sao, một lần nữa, xin lỗi vì những lời khuyên tồi tệ. Tôi đoán rằng tôi đã không thực sự thực hiện nhiều mã hóa C / C ++ trên Mac OS X nơi tôi muốn tránh API OS (CFString, v.v.) kể từ những ngày CodeWarrior ... NS

tan chảy

Áp phích gốc
Ngày 4 tháng 12 năm 2006
Katy, Texas
  • Ngày 11 tháng 6 năm 2007
Ahhhha. Có ý nghĩa. Cảm ơn Wittegijt & iSee. Tôi đã đọc 'Bách khoa toàn thư C' (Sybex, 1991) của mình và tất cả (hoặc rất nhiều, ít nhất) các từ khóa không chuẩn của Microsoft đều có dấu gạch dưới cho ký tự đầu tiên. Nên đã cho tôi biết.

OK, bây giờ để strcasecmp () . Trang web cppreference.com mà tôi đang sử dụng có vẻ chỉ là C / C ++ tiêu chuẩn. Tôi đã tìm kiếm một trang web tham khảo cụ thể cho Mac OS X XCode nhưng vẫn chưa tìm thấy. Trang web tham khảo Mac OS X C ++ tốt là gì? Hoặc, có tham chiếu C ++ được tích hợp sẵn trong XCode trợ giúp ở đâu đó và tôi vẫn chưa tìm thấy nó? Hoặc, thất bại tất cả những điều đó, có cái nào trên Trung tâm Phát triển Apple mà tôi cũng đã bỏ qua không?

Lớn như hình ảnh đĩa XCode mà tôi tải xuống và cài đặt khi được nhắc, chắc chắn ai đó có tham chiếu ngôn ngữ trong đó - ý tôi là, nội dung Java mà tôi tải xuống ban đầu rất LỚN.

Todd

Krevnik

8 tháng 9, 2003
  • Ngày 11 tháng 6 năm 2007
toddburch nói: OK, bây giờ để strcasecmp () . Trang web cppreference.com mà tôi đang sử dụng có vẻ chỉ là C / C ++ tiêu chuẩn. Tôi đã tìm kiếm một trang web tham khảo cụ thể cho Mac OS X XCode nhưng vẫn chưa tìm thấy. Trang web tham khảo Mac OS X C ++ tốt là gì? Hoặc, có tham chiếu C ++ được tích hợp sẵn trong XCode trợ giúp ở đâu đó và tôi vẫn chưa tìm thấy nó? Hoặc, thất bại tất cả những điều đó, có cái nào trên Trung tâm Phát triển Apple mà tôi cũng đã bỏ qua không?

Nó ở đó, nhưng tôi không nghĩ rằng nó đi qua các chức năng C trong lớp POSIX, chỉ là tất cả các bổ sung của Apple cho POSIX. Bạn có thể sử dụng thiết bị đầu cuối để truy cập các trang nam trên một số chức năng này. 'man strcasecmp' sẽ đưa bạn đến ngay trang nói về hàm đó và mô tả cách sử dụng nó.

tôi hiểu rồi

Ngày 25 tháng 10 năm 2004
  • Ngày 11 tháng 6 năm 2007
Xem xét xung quanh Xcode, tôi tìm thấy một liên kết đến trang này:

http://developer.apple.com/documentation/Darwin/Reference/ManPages/index.html

là mục lục cho mọi thứ trong trang người dùng OS X, bao gồm cả các chức năng của thư viện C.

Thư viện tham chiếu Xcode truy cập các trang nam ngoài các tài nguyên khác, vì vậy tất cả các trang này đều có sẵn thông qua Xcode (tôi luôn sử dụng 'Tìm Văn bản đã Chọn trong Tham chiếu API').

Có vẻ như các hàm C nằm trong phần 3. Có vẻ như tài liệu cho mỗi hàm chứa phần 'tiêu chuẩn' hoặc 'lịch sử' cung cấp một số thông tin về tiêu chuẩn mà hàm tuân thủ. Rõ ràng strcasecmp () đã được chuyển từ 'string.h' sang 'string.h' vì lý do tuân thủ. Tôi không chắc chính xác cách nào khiến nó tuân thủ. Tôi đoán điều đó có nghĩa là các hàm không chuẩn sẽ không xuất hiện trong string.h, vì vậy họ đã chuyển nó sang một tệp tiêu đề khác. NS

tan chảy

Áp phích gốc
Ngày 4 tháng 12 năm 2006
Katy, Texas
  • Ngày 11 tháng 6 năm 2007
Đó là một trang tham khảo tuyệt vời! Tôi đã tìm ra thông tin như thế ở đó ở đâu đó!