2013-10-09 60 views
-1

你如何接受不區分大小寫,並允許用戶輸入嵌入的空白?因此,用戶可以輸入「hong konG」並獲得與輸入的正確匹配。如何接受不區分大小寫的輸入?

我只有只接受,如果敏感的情況下是在單詞的開頭input[0] = toupper(input[0]);

while(true){ 
cout << "Enter a city by name: "<< " "; 
std::getline (std::cin,input); 
if (input == "quit") 
    { 
     break; 
    } 
input[0] = toupper (input[0]); 

    //....how do I loop to find all letter's in the input string variable?  
} 
+0

如果您想多次執行某些操作(如大寫字符串中的每個字符),請編寫一個循環。因此,編寫一個在每個字符上使用toupper的循環。如果你展示了更多的代碼,我可能會告訴你如何做到這一點。只有一行代碼不太適合。 – john

+0

而當你想寫一個循環時,你會意識到它有一個更清晰的算法。這個是'std :: transform'。 – chris

+1

@chris我是一個老前輩,但我從來沒有發現循環不清楚。 – john

回答

4

您可以使用一個循環整個字符串一個字符轉換爲大寫的時間,但更好的解決方案是使用C++標準庫的transform功能爲:

std::string hk = "hong konG"; 
std::transform(hk.begin(), hk.end(), hk.begin(), ::toupper); 

這將::toupper應用於您的字符串的所有字符,產生一個字符串,其內容爲"HONG KONG"

Demo on ideone.

+0

轉換的庫是什麼? –

+1

'#include ' – john

+0

此代碼可能會調用UB進行任意用戶輸入,請參閱https://stackoverflow.com/q/21805674/3002139 –

0

您可以將整個字符串轉換爲大寫這樣

for (size_t i = 0; i < input.size(); ++i) 
    input[i] = toupper (input[i]); 

其他建議,使用std::transform也是一個非常好的解決方案。

+0

它不起作用,當我將以上代碼添加到代碼中時,它不是「cout」代碼退出。 –

+1

也許你在某個地方犯了一個錯誤,很難說沒有看到你的代碼。 – john

+0

我不想改變所有的字符串爲大寫,我只是想確保,如果有人在進入「金剛」的輸出仍將出來是「崗」。 –

2
for (auto& c : str) 
    c = std::toupper(c) 
+0

該代碼可能調用UB對於任意用戶輸入,見https://stackoverflow.com/q/21805674/3002139 –