2012-12-31 1039 views
-2

請注意,我並不是問在C++中將小寫字母轉換爲大寫字母的方法是什麼,而是我想知道下面代碼(Upper1和Upper2)中的哪兩種方法更好比另一個更重要,這是什麼原因,編程是明智的。在C++中將小寫字母轉換爲大寫字母

#include <string> 
#include <iostream> 
#include <locale> //Upper2 requires this module 

using namespace std; 

void Upper1(string &inputStr); 
void Upper2(string &inputStr); 

int main(){ 

    string test1 = "ABcdefgHIjklmno3434dfsdf3434PQRStuvwxyz"; 
    string test2 = "ABcdefgHIjklmnoPQRStuvwxyz"; 

    Upper1(test1); 
    cout << endl << endl << "test1 (Upper1): "; 
    for (int i = 0; i < test1.length(); i++){ 
     cout << test1[i] << " "; 
    } 


    Upper2(test2); 
    cout << endl << endl << "test2 (Upper2): "; 
    for (int i = 0; i < test2.length(); i++){ 
     cout << test2[i] << " "; 
    } 

    return 0; 
} 

void Upper1(string &test1){ 

    for (int i = 0; i < 27; i++){ 
     if (test1[i] > 96 && test1[i] <123){ //convert only those of lowercase letters 
      test1[i] = (char)(test1[i]-(char)32); 
     } 

    } 
} 

void Upper2(string &test2){ 

    locale loc; 

    for (size_t i=0; i<test2.length(); ++i) 
     test2[i] = toupper(test2[i],loc); 
} 

回答

3

兩個提出的解決方案之間的主要區別是 Upper2作品種類,不管平臺; Upper1 作出關於編碼的假設,並且在我知道的任何現代平臺上都不起作用 。 (它假定ASCII和 ASCII是,對於所有意圖和目的,死)

當然,無論是真正起作用,兩個簡單的原因:在 第一個是最現代化的機器使用一個多字節編碼 (UTF -8),所以您不能一次將字節從低位字節轉換爲高位字節。第二個原因是因爲一般說來是一對一的關係,從低到高: 經典示例是'ß',其大寫字母等於 兩個字符串"SS"。儘管如此,對於函數的定義和單字節編碼如ISO 8859-1(可能是最近使用最廣泛的), Upper2將做得相當不錯(假設沒有'ß' 在輸入中),足以用於許多用途,而Upper1將可悲地失敗。

+0

您指出了一些優點,謝謝! – Cache

0
  1. TOUPPER()可以處理非ASCII字符
  2. 語法明智的,Upper2()是不太容易出錯
  3. 不太清楚這一點,但我認爲TOUPPER ()更慢
+0

你爲什麼認爲3? (這顯然取決於實施,在20多年裏我還沒有做過實際的測量,但是當我測量的時候,'toupper'明顯更快。) –

2

如果您使用其他語言的英文字母,例如英文字母,則使用toupper將沒有任何意義。日耳曼語ä,ö或ü,以及法語/西班牙語的各種重音字母,當然,如果輸入是俄語拉丁語的話,例如俄語。 [正如詹姆斯指出的那樣,這可能需要Unicode解析,這是一個全新的球賽,]'

顯然,第一個函數也是硬編碼的,用於轉換輸入的27個第一個字符,即錯誤的編碼,因爲該函數不應該依賴於字符串的大小 - 特別是因爲「std :: string」確實有一個長度!

+0

感謝您的解釋:)我真的很感激它。 – Cache

相關問題