2011-11-28 4 views
1

알파벳순 정렬을 위해 문자열을 대문자로 변환하는 데 문제가 있습니다. 내 프로그램은 실제로 세 번째 단어 집합 이후에 느려지고 멈추기 시작합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?문자열을 모두 대문자로 변환 - C++

string iName = list[i]->GetLastName(); // This just returns a string of a name 
string jName = list[j]->GetLastName(); 

for(unsigned int k = 0; k < iName.length(); k++) 
    { 
    iName[k] = toupper(iName[k]); 
    } 

for(unsigned int l = 0; l < jName.length(); l++) 
    { 
    iName[l] = toupper(jName[l]); 
    } 
+5

'iName'으로'jName'의 철자가 잘못되었습니다. –

+2

@KerrekSB, 아하, 같은 일을 발견, 내 대답을 제거, 더 나은 의견을 짐작하다. – Nim

+0

@nim 그냥 똑같은 짓을 했어. : D –

답변

7

다른 사람들이 말했듯이, 당신이 혼합 iname 여기서 및 jname .... 당신은 왜 했는가 이?

붙여 넣기 때문에 붙여 넣기!

프로그래밍에서 좋은 초기 수업은 복사 붙여 넣기를 시도하고 피하는 것입니다! 대신 ..... 귀하의 경우

를 ... 시도하고 함수를 만들

void stringToUpper(string &s) 
{ 
    for(unsigned int l = 0; l < s.length(); l++) 
    { 
    s[l] = toupper(s[l]); 
    } 
} 

은 다음

stringToUpper(iName); 
stringToUpper(jName); 

을 할 수있는이 방법 redues 붙여 넣기를 복사 관련 오류의 LOT 및 일반적으로 프로그램을 더욱 모듈화하는 데 도움이됩니다.

+2

이제 그는 당신의 기능을 복사하여 붙여 넣을 것입니다. :) 당신은 맞습니다. 이것은 좋은 습관입니다. – duckbrain

11

사용 STL algorithm 라이브러리 :

std::for_each(iName.begin(), iName.end(), std::toupper); 

또는 (가 @Kerrek SB에 의해 제안)

std::transform(s.begin(), s.end(), s.begin(), std::toupper); 
+5

[변형] (http://stackoverflow.com/questions/1489313/c-stdtransform-and-toupper-why-does-this-fail)이 더 좋습니다. –

+0

그래도 내 버전이 작동하므로 IMO가 더 좋습니다. 이 코드를 단축하고 싶다면'std :: for_each (iName.begin(), iName.end(), [] (char & c) {c = std :: toupper (c);}); ' – Hauleth

+0

그렇습니다, 적절한 위치에서 할 수 있다는 것에 대한 좋은 지적입니다. 건배. –

-2

표준은 문자열에 [] 연산자를 사용하여 내용을 수정하면 안된다는 것이 좋습니다. string은 변경 불가능한 객체로 설계되었으며 코드가 해당 표준을 위반합니다. 그래서 저는 대답이 설계되지 않은 방식으로 클래스를 사용하고 있기 때문에 어떤 일이 일어 났는지 말할 수 없다고 생각합니다. 그것은 내부 색인 또는 다른 것을 엉망으로 만들 수 있습니다. 우리는 문자열 클래스가 내부적으로 무엇을할지 모른다.

즉, 그것은 작동해야한다고 생각합니다 :)

+6

불행히도 사실이 아닙니다. 너 어디서 가져 가니? –

+0

java에 시간이 너무 많습니까? 어디에서 문자열을 쓸 수 있습니까? – Assimilater

관련 문제