【问题标题】:lowercase to uppercase in C++ [closed]C ++中的小写到大写[关闭]
【发布时间】:2012-12-31 13:07:27
【问题描述】:

请注意,我不是在问在 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);
}

【问题讨论】:

    标签: c++ uppercase lowercase


    【解决方案1】:

    两种提议的解决方案之间的主要区别在于 Upper2 之类的作品,不分平台; Upper1 对编码做出假设,并且不起作用 我知道的任何现代平台。 (它假设 ASCII,并且 无论如何,ASCII 已经死了。)

    当然,这两种方法都不起作用,原因有两个: 首先是大多数现代机器使用多字节编码 (UTF-8),因此您无法将字符串从低位转换为高位 一个字节。第二个是因为没有,一般 从下到上的一对一关系: 经典示例是'ß',其大写等效项是 两个字符串"SS"。尽管如此,对于一个有点简单的 函数的定义,以及像 ISO 一样的单字节编码 8859-1(可能是最近使用最广泛的), Upper2 会做得相当不错(前提是没有'ß' 在输入中),足以满足多种用途,而 Upper1 将失败。

    【讨论】:

    • 你指出了一些好的地方,谢谢!
    【解决方案2】:

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

    显然,第一个函数也被硬编码以转换输入的前 27 个字符,这是不好的编码,因为该函数不应该依赖于字符串的大小 - 特别是因为 "std::string"首先确实有长度!

    【讨论】:

    • 感谢您的解释 :) 非常感谢。
    【解决方案3】:
    1. toupper() 可以处理非ASCII字符
    2. 语法方面,Upper2() 不易出错
    3. 对此不太确定,但我认为 toupper() 较慢

    【讨论】:

    • 你为什么认为3? (这显然取决于实现,我已经有 20 多年没有进行实际测量了,但是当我进行测量时,toupper 的速度明显更快。)
    猜你喜欢
    • 2012-11-13
    • 2013-10-24
    • 2018-03-12
    • 2016-03-28
    • 2019-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多