2011-11-28 44 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

你拼錯'jName'作爲'iName'。 –

+2

@KerrekSB,aha,發現了相同的東西,刪除了我的答案,並且將其當作評論來猜測更好 – 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複製粘貼相關的錯誤很多,一般而言,有助於使您的程序更加模塊化

+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

[transform](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

標準建議您不應在字符串上使用[]運算符來修改其內容。字符串被設計爲一個不可變的對象,你的代碼正在打破這個標準。所以我想答案是,很難說出可能發生什麼,因爲你正在以一種沒有設計的方式使用這個類。這可能會搞亂一些內部索引或其他東西。我們不知道字符串類可能在內部做什麼。

這就是說,它似乎應該工作:)

+6

不幸的是,事實並非如此。你從哪裏拿走? –

+0

在java中可能太多時間了?哪裏字符串不可變? – Assimilater