2012-09-24 59 views
2
的不區分大小寫平等

可能重複:
Case insensitive string comparison in C++C++,檢查兩個字符串

我已經寫了一些代碼,在C++來比較兩個字符串是否相等。我想要的是校對。我計劃在將來使用它來獲得更多的程序,所以重要的是這個功能很好地完成它的工作。這個函數看起來像是可重用,可移植等?有沒有更新的「最新」方法?我用了一個c庫,但這是一個C++程序,是那個禁忌?

謝謝,JH。

//function to compare two strings regardless of case 
//-- returns true if the two strings are equal 
//-- returns false if 
// --the strings are unequal 
// --one of the strings is longer than 255 chars 
bool isEqual(string str1, string str2){ 

    if(str1.length()!=str2.length()) //the strings are different lengths, 
    return false;    //they can't be equal 
    if((str1.length()>255) || (str2.length()>255)) 
    return false; 

    char * cstr1 = new char [str1.length()+1]; 
    strcpy (cstr1, str1.c_str()); 
    char * cstr2 = new char [str2.length()+1]; 
    strcpy (cstr2, str2.c_str()); 

    for(int i=0; i<str1.length()+1; i++){ 
    if(toupper(cstr1[i]) != toupper(cstr2[i])) 
     return false; 
    } 

    return true; 
} 
+0

哎呀,沒有看到你希望它是不區分大小寫。 –

+5

對於初學者,您會泄漏內存。這是一件壞事。 –

+0

哎呀,怎麼/在哪裏? –

回答

18

您應該重命名功能isEqual_CaseInsensitive或某事有相匹配的功能做什麼的名稱。 你應該通過引用傳遞字符串,以避免拷貝 你並不需要創建一個字符串拷貝到他們比較

bool isEqual_CaseInsensitive(const string& a, const string& b) 
    { 
      return a.size() == b.size() && 
       std::equal(a.begin(), a.end(), b.begin(), [](char cA, char cB) { 
         return toupper(cA) == toupper(cB); 
        }); 
    } 
+0

非常感謝。這是return關鍵字的一個優雅用法。 –

+0

這裏有一個關於這個函數的問題:[](char cA,char cB){ return toupper(cA)== toupper(cB); } ...這個函數是無名的嗎?或者它被命名爲[],或者是[]指示該函數的返回類型?它似乎是一個布爾函數畢竟(和std :: equal要求,對吧?http://www.cplusplus.com/reference/algorithm/equal/) –

+0

+1。如果這個問題將被標記爲重複:在那裏沒有這樣的優雅的解決方案:另一方面,問題來自於:http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c 2008 ... – PiotrNycz

2

功能看起來相當不錯,除了:

這些轉換到C字符串是沒有必要的:

char * cstr1 = new char [str1.length()+1]; 
    strcpy (cstr1, str1.c_str()); 
    char * cstr2 = new char [str2.length()+1]; 
    strcpy (cstr2, str2.c_str()); 

,因爲你可以在C字符串如訪問的std :: string字母:

for(int i=0; i<str1.length(); i++){ 
    if(toupper(str1[i]) != toupper(str2[i])) 
     return false; 
    } 

也注意到,我刪除+1i<str1.length() + 1 ...

對於其他的方法 - 看有:Case insensitive string comparison in C++

+0

非常感謝您 –

+0

@PiotrNycz爲此,您還需要確認它們是否相同長度。 – loganfsmyth

+0

@loganfsmyth - 我認爲代碼的其餘部分沒有改變。並測試相同的長度。 – PiotrNycz