2013-10-09 4 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

Вы можете использовать цикл, чтобы преобразовать всю строку в верхний регистр по одному символу за раз, но лучшим решением является использование transform функции стандартной библиотеки C++ для что:

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

Я не хочу менять все строки в верхнем регистре, я просто хочу убедиться, что если кто-то войдет в «konG», выход все равно выйдет «kong». –

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

Этот код потенциально вызывает UB для произвольного ввода пользователя, см. Https://stackoverflow.com/q/21805674/3002139 –

Смежные вопросы