2012-12-31 6 views
-2

Обратите внимание, что я не спрашиваю, какие методы конвертируют строчные буквы в буквы UPPERCASE на C++, но вместо этого я хочу знать, какой из этих двух методов в приведенных ниже кодах (Upper1 и Upper2) лучше чем другой, и в чем причина, программирование мудрое.в нижнем регистре в верхнем регистре в C++

#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

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

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

+0

вы указали несколько хороших моментов, спасибо! – Cache

0
  1. ToUpper() может обрабатывать без символов ASCII
  2. Синтаксиса мудрых, Upper2() менее подвержены ошибки
  3. не слишком уверены в этом, но я думаю, что ToUpper() является более медленным
+0

Почему, на ваш взгляд, 3? (Очевидно, что это зависит от реализации, и я не делал фактических измерений более 20 лет, но когда я это сделал, «toupper» был значительно быстрее.) –

2

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

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

+0

спасибо за объяснения :) Я очень ценю это. – Cache