C ++中小写到大写

时间:2012-12-31 13:07:28

标签: c++ uppercase lowercase

请注意,我不是问在C ++中将小写字母转换为大写字母的方法是什么,而是想知道下面代码中哪两种方法(Upper1和Upper2)比另一种方法更好,这是什么原因,编程明智。

#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 个答案:

答案 0 :(得分:3)

两个提出的解决方案之间的主要区别在于 无论平台如何,Upper2都有效; Upper1 做出关于编码的假设,并且不起作用 我所知道的任何现代平台。 (它假设ASCII,和 对于所有意图和目的,ASCII都是死的。)

当然,由于两个简单的原因,两者都不起作用 首先,大多数现代机器使用多字节编码 (UTF-8),因此您无法将字符串从低位转换为高位 一次一个字节。第二是因为通常没有 说,从低到高的一对一关系: 经典的例子是'ß',它的大写等价物是。{1} 两个字符串"SS"。仍然,有点过分简单 函数的定义,以及像ISO一样的单字节编码 8859-1(可能是最近使用最广泛的), Upper2会做得相当不错(前提是没有'ß' 在输入中),适用于多种用途,而Upper1则会令人遗憾。

答案 1 :(得分:2)

如果您使用其他语言的英文A-Z字母,例如toupper的使用将没有意义。日耳曼语ä,ö或ü,以及法语/西班牙语中的各种重音字母,当然,如果输入是“德语 - 拉丁语”,例如俄语。 [正如詹姆斯所指出的,这可能需要Unicode解析,这完全是一个全新的球赛,所以']

显然,第一个函数也是硬编码来转换输入的27个第一个字符,这是错误的编码,因为函数不应该依赖于字符串的大小 - 特别是因为“std :: string”确实有一个长度!

答案 2 :(得分:0)

  1. toupper()可以处理非ASCII字符
  2. 语法明智, Upper2()不易出错
  3. 对此不太确定,但我认为 toupper()较慢