2012-12-31 262 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

相关问题