2013-11-09 46 views
0

所以,我一直在做Reddit的daily programmer #140,不能使用std :: toupper和std :: erase。無法找到toupper和擦除

包括:

#include <iostream> 
#include <string> 
#include <cctype> 

部分與toupper和擦除(用於轉換的話 '駝峯'):

std::string tekst; 
std::cin >> tekst;  

tekst[0] = std::touppper(tekst[0]); 
for(unsigned int i = 0; i < tekst.size(); i++){ 
    if(tekst[i] == 32){ 
     std::erase(tekst[i], 1); 
     tekst[i] = std::toupper(tekst[i]); 
    } 
} 

而編譯器顯示錯誤:

error: 'touppper' is not a member of 'std' 
error: 'erase' is not a member of 'std' 

能有什麼導致它?提前致謝!

+0

這些都不是標準功能...... – chris

+0

@克里斯[呵呵RLY?](http://en.cppreference.com/w/cpp/string/byte/toupper) – 2013-11-09 20:19:27

+0

不指定編譯器,但在MSVC你需要'#include ' –

回答

1

std::touppper不存在,因爲它是有兩個拼寫p的,不與三:)。 std::erase不是標準功能,請檢查:Help me understand std::erase

+0

哦,上帝,謝謝你爲像我這樣的noob節省你的時間:) – Demiu

+0

@ user2974775這個錯誤可能發生在任何人身上,不要判斷你自己:) –

0

您可能希望使用std::toupper()作爲實施的基礎。但請注意,std::toupper()將其參數設爲int,並要求該參數爲正值EOF。將負值傳遞給std::toupper()的一個參數版本將導致未定義的行爲。在已簽名char的平臺上,您將很容易獲得負值,例如,在使用ISO-Latin-1編碼時,我的第二個名稱。該規範的方法是使用std::toupper()char轉換爲unsigned char

tekstr[0] = std::toupper(static_cast<unsigned char>(tekstr[0])); 

對於erase()你可能尋找std::string::erase()

tekstr.erase(i); 

注意,如果在字符串中的空白結束,在將最後一個空間吹走之後,您不想訪問索引i處的角色!