строчные и прописные в переполнении стека

обратите внимание, что я не спрашиваю, каковы методы преобразования строчных букв в верхние буквы в 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);
}

-2

Решение

Основное различие между двумя предлагаемыми решениями состоит в том, что
Upper2 род работ, независимо от платформы; Upper1
делает предположения относительно кодировки и не работает на
любая современная платформа, о которой я знаю. (Предполагается ASCII, и
ASCII, по сути, мертв.)

Конечно, ни один из них не работает, по двум простым причинам:
Во-первых, большинство современных машин используют многобайтовую кодировку.
(UTF-8), поэтому вы не можете преобразовать строку из нижней в верхнюю
байт за раз. Во-вторых, потому что нет, как правило,
говоря, отношение один к одному от нижнего к верхнему:
классический пример 'ß', чей верхний регистр эквивалентен
строка из двух символов "SS", Тем не менее, для несколько упрощенной
определение функции и однобайтовой кодировки, такой как ISO
8859-1 (вероятно, наиболее широко используемый в недавнем прошлом),
Upper2 будет делать достаточно хорошую работу (при условии, что нет 'ß'
на входе), подходит для многих целей, тогда как Upper1 потерпит неудачу

3

Другие решения

Использование toupper не имеет смысла, если у вас есть буквы на других языках, кроме английского алфавита A-Z, например германский ä, ö или ü, а также различные акцентированные буквы на французском / испанском и, конечно, если ввод вообще является «германо-латинским» языком, например русский. [Как указал Джеймс, для этого может потребоваться разбор Unicode, что является совершенно новой игрой в мяч, хотя ‘]

Очевидно, что первая функция также жестко запрограммирована для преобразования 27 первых символов ввода, что является плохим кодированием, потому что функция не должна полагаться на размер строки — особенно не потому, что «std :: string» действительно имеет длина на первом месте!

2

  1. ToUpper () может обрабатывать не-ASCII символ
  2. Синтаксис мудрый, Upper2 () менее подвержен ошибкам
  3. Не слишком уверен в этом, но я думаю ToUpper () медленнее
0
По вопросам рекламы [email protected]