обратите внимание, что я не спрашиваю, каковы методы преобразования строчных букв в верхние буквы в 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);
}
Основное различие между двумя предлагаемыми решениями состоит в том, что
Upper2
род работ, независимо от платформы; Upper1
делает предположения относительно кодировки и не работает на
любая современная платформа, о которой я знаю. (Предполагается ASCII, и
ASCII, по сути, мертв.)
Конечно, ни один из них не работает, по двум простым причинам:
Во-первых, большинство современных машин используют многобайтовую кодировку.
(UTF-8), поэтому вы не можете преобразовать строку из нижней в верхнюю
байт за раз. Во-вторых, потому что нет, как правило,
говоря, отношение один к одному от нижнего к верхнему:
классический пример 'ß'
, чей верхний регистр эквивалентен
строка из двух символов "SS"
, Тем не менее, для несколько упрощенной
определение функции и однобайтовой кодировки, такой как ISO
8859-1 (вероятно, наиболее широко используемый в недавнем прошлом),
Upper2
будет делать достаточно хорошую работу (при условии, что нет 'ß'
на входе), подходит для многих целей, тогда как Upper1
потерпит неудачу
Использование toupper не имеет смысла, если у вас есть буквы на других языках, кроме английского алфавита A-Z, например германский ä, ö или ü, а также различные акцентированные буквы на французском / испанском и, конечно, если ввод вообще является «германо-латинским» языком, например русский. [Как указал Джеймс, для этого может потребоваться разбор Unicode, что является совершенно новой игрой в мяч, хотя ‘]
Очевидно, что первая функция также жестко запрограммирована для преобразования 27 первых символов ввода, что является плохим кодированием, потому что функция не должна полагаться на размер строки — особенно не потому, что «std :: string» действительно имеет длина на первом месте!