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