2012-02-07 62 views
6

Tôi biết có nhiều cách để so sánh trường hợp bỏ qua liên quan đến việc lặp qua chuỗi hoặc good one trên SO cần một thư viện khác. Tôi cần phải đặt điều này trên các máy tính khác có thể chưa được cài đặt. Có cách nào để sử dụng các thư viện chuẩn để làm điều này không? Ngay bây giờ tôi chỉ đang làm ...So sánh chuỗi không phân biệt chữ hoa chữ thường C++

if (foo == "Bar" || foo == "bar") 
{ 
cout << "foo is bar" << endl; 
} 

else if (foo == "Stack Overflow" || foo == "stack Overflow" || foo == "Stack overflow" || foo == "etc.") 
{ 
cout << "I am too lazy to do the whole thing..." << endl; 
} 

Điều này có thể cải thiện đáng kể khả năng đọc và khả năng sử dụng mã của tôi. Cảm ơn đã đọc đến đây.

+2

Nghiêm túc? Ngay cả khi không có cách tích hợp, bạn có thể * dễ dàng * viết một hàm để làm điều đó thay vì brute buộc mỗi so sánh riêng lẻ. Có gì sai khi lặp qua các chuỗi? Đó là những gì bất kỳ thư viện bạn sẽ sử dụng sẽ làm gì. –

+3

stricmp có sẵn ở mọi nơi. – arx

+0

Thư viện chuẩn nào có sẵn tùy thuộc vào phiên bản trình biên dịch C++ nào bạn định sử dụng để biên dịch nhị phân của mình. Ví dụ, C++ 0x có hỗ trợ regex. Đối với các trình biên dịch cũ hơn, bạn có thể sử dụng stricmp. – Alan

Trả lời

15

strncasecmp

Các strcasecmp() chức năng thực hiện một sự so sánh byte-by-byte của chuỗi s1s2, bỏ qua trường hợp của các ký tự. Nó trả về một số nguyên nhỏ hơn, bằng hoặc lớn hơn 0 nếu s1 được tìm thấy, tương ứng, nhỏ hơn, để khớp hoặc lớn hơn s2.

Chức năng strncasecmp() là tương tự, ngoại trừ việc nó so sánh không quá n byte s1s2 ...

+0

Cảm ơn, điều này cuối cùng đã làm việc! – CoffeeRain

+3

@CoffeeRain: Bạn rất được hoan nghênh! Tôi vui vì bạn thích một chức năng C trường cũ đơn giản trên macaroni mambo-jumbo C++ :) –

+0

là nó phải được để trống? – nfoggia

2

tại sao bạn không làm cho mọi trường hợp thấp hơn và sau đó so sánh?

tolower()

int counter = 0; 
    char str[]="HeLlO wOrLd.\n"; 
    char c; 
    while (str[counter]) { 
    c = str[counter]; 
    str[counter] = tolower(c); 
    counter++; 
    } 

    printf("%s\n", str); 
+0

Tôi đã thử điều đó, nhưng nó không hoạt động tốt lắm. Bạn có thể cung cấp một ví dụ? Tôi sẽ cố gắng để đăng mã lỗi của tôi ... – CoffeeRain

6

thường những gì tôi làm chỉ là so sánh một phiên bản thấp hơn-cased của chuỗi trong câu hỏi, như:

if (foo.make_this_lowercase_somehow() == "stack overflow") { 
    // be happy 
} 

Tôi tin rằng tăng đã xây dựng-in chuyển đổi chữ thường, vì vậy :

#include <boost/algorithm/string.hpp>  

if (boost::algorithm::to_lower(str) == "stack overflow") { 
    //happy time 
} 
+0

Boost là một trong những mà tôi liên kết với ... Tôi không có điều đó. – CoffeeRain

+0

tăng miễn phí theo mọi nghĩa, bạn chỉ cần lấy thuật toán to_lower ra khỏi đó nếu bạn không thể cài đặt nó vì một lý do nào đó. –

+1

Giá trị trả về của 'to_lower' bị vô hiệu. Bạn phải áp dụng 'to_lower' trước, và sau đó so sánh như bình thường. Trên gcc, ở trên sẽ cung cấp cho bạn một giá trị 'void void không bị bỏ qua vì nó phải là'. – Fadecomic

2

Bạn có thể viết một hàm đơn giản để chuyển đổi chuỗi hiện có để chữ thường như sau:

#include <string> 
#include <ctype.h> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 

std::string make_lowercase(const std::string& in) 
{ 
    std::string out; 

    std::transform(in.begin(), in.end(), std::back_inserter(out), ::tolower); 
    return out; 
} 

int main() 
{ 
    if(make_lowercase("Hello, World!") == std::string("hello, world!")) { 
    std::cout << "match found" << std::endl; 
    } 

    return 0; 
} 
2

tôi chỉ viết này, có lẽ nó có thể có ích cho ai đó:

int charDiff(char c1, char c2) 
{ 
    if (tolower(c1) < tolower(c2)) return -1; 
    if (tolower(c1) == tolower(c2)) return 0; 
    return 1; 
} 

int stringCompare(const string& str1, const string& str2) 
{ 
    int diff = 0; 
    int size = std::min(str1.size(), str2.size()); 
    for (size_t idx = 0; idx < size && diff == 0; ++idx) 
    { 
     diff += charDiff(str1[idx], str2[idx]); 
    } 
    if (diff != 0) return diff; 

    if (str2.length() == str1.length()) return 0; 
    if (str2.length() > str1.length()) return 1; 
    return -1; 
} 
Các vấn đề liên quan