2012-02-07 129 views
6

我知道有辦法做案例忽略比較,涉及遍歷字符串或一個good one SO上需要另一個庫。我需要把它放在其他可能沒有安裝的計算機上。有沒有辦法使用標準庫來做到這一點?現在我只是在做...不區分大小寫的字符串比較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; 
} 

這可以大大提高我的代碼的可讀性和可用性。感謝您閱讀這些。

+2

認真嗎?即使沒有內置的方式,你也可以很容易地編寫一個函數來做到這一點,而不是蠻橫強迫每一個單獨的比較。遍歷字符串有什麼問題?這就是你要使用的任何圖書館都會做的。 – 2012-02-07 19:58:06

+3

stricmp無處不在。 – arx 2012-02-07 20:01:15

+0

可用的標準庫取決於您計劃使用哪種版本的C++編譯器來編譯二進制文件。例如,C++ 0x具有正則表達式支持。對於較老的編譯器,可以使用stricmp。 – Alan 2012-02-07 20:05:32

回答

15

strncasecmp

strcasecmp()函數執行串S1S2的逐字節比較,忽略字符的大小寫。如果發現s1分別小於,等於或大於0,則返回小於,等於或大於s2的整數。

strncasecmp()功能類似,只是它比較不超過ň字節S1S2 ...

+0

謝謝,這終於奏效了! – CoffeeRain 2012-02-07 20:08:03

+3

@CoffeeRain:非常歡迎您!我很高興你喜歡簡單的舊學校C功能超過曼波C++通心粉:) – 2012-02-07 21:44:17

+0

它應該是空白的? – nfoggia 2014-02-10 17:17:02

2

你爲什麼不讓小寫字母變小寫然後比較一下?

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

我正在嘗試這種方式,但它工作得不是很好。你能提供一個例子嗎?我會嘗試發佈我的錯誤代碼... – CoffeeRain 2012-02-07 19:59:19

6

平時我做什麼,只是比較一個小寫的版本有問題的字符串,如:

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

我相信升壓內置了小寫轉換的話, :

#include <boost/algorithm/string.hpp>  

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

Boost是我鏈接到的那個...我沒有那個。 – CoffeeRain 2012-02-07 20:00:14

+0

boost在任何意義上都是免費的,如果出於某種原因無法安裝它,則可以將to_lower算法從其中取出。 – 2012-02-09 15:38:33

+1

'to_lower'的返回值是無效的。你必須首先應用'to_lower',然後照常進行比較。在gcc上面,會給你一個'不值得忽略的空值,因爲它應該是'錯誤。 – Fadecomic 2012-10-31 19:50:20

2

您可以編寫一個簡單的函數,以現有的字符串轉換爲小寫如下:

#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

我剛纔寫的,也許它可能是有用的人:

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; 
} 
相關問題