2012-12-31 4 views
-2

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), 한 번에 한 문자열 씩 바이트를 아래에서 위로 변환 할 수 없습니다. 두 번째 이유는 일반적으로 말하기, 1 대 1의 관계가 낮기 때문입니다. 클래식 예는 'ß'이며 대문자는 두 개의 문자열 "SS"입니다. 여전히 다소 단순한 함수의 정의와 ISO 8859-1 (최근 과거에 가장 널리 사용 된 것임)과 같은 단일 바이트 인코딩의 경우 Upper2은 합리적으로 좋은 작업을 수행합니다 ('ß' 이없는 경우). 입력에서), 많은 용도에 적합하지만, Upper1은 비참하게 실패 할 것입니다.

+0

당신은 좋은 점을 지적했습니다. 감사합니다! 설명을 위해 – Cache

0
  1. 의 ToUpper() 비 ASCII 문자를
  2. 구문 지혜, Upper2()를 덜 오류가 발생하기 쉬운 이것에 대해
  3. 너무 확실하지,하지만 난 의 ToUpper 생각 처리 할 수 ​​있습니다()이 더 느림
+0

왜 3이라고 생각하십니까? (구현에 의존적 인 것은 분명하며, 20 년이 넘는 시간 동안 실제 측정을하지는 않았지만 측정했을 때 'toupper'가 훨씬 빨랐습니다.) –

2

영어 A-Z 알파벳 이외의 다른 언어의 문자가있는 경우 toupper의 사용법이 적합하지 않습니다. Germanic ä, ö 또는 ü 및 프랑스어/스페인어로 다양한 악센트 부호가있는 문자를 사용합니다. 물론 입력이 "germano-latin"언어 인 경우 (예 : 러시아어). [제임스가 지적했듯이 유니 코드 구문 분석이 필요합니다. 이것은 완전히 새로운 볼 게임입니다.]

분명히 첫 번째 기능은 입력의 27 번째 문자를 하드 코딩하여 함수가 문자열의 크기에 의존해서는 안되기 때문에 코딩이 잘못되었습니다. 특히 "std :: string"은 길이가 처음부터 없습니다.

+0

고마워 :) 정말 고마워. – Cache