2013-11-16 7 views
0

Я искал и не нашел ответа на этот вопрос. Я прошу пользователя ввести свое имя, и я хочу автоматически форматировать имя так, чтобы независимо от того, как они вводят имя, оно будет выглядеть как первая буква первой буквы, а нижний регистр - остальное. Например, если они войдут в «joHN», программа все равно выведет свое имя как «Джон».Заглавная буква первая, нижний регистр остальные

У меня есть следующий код для их ввода имени:

string name; 
    cout << "Please enter your first name: "; 
    cin >> name; 

Я предполагаю, что я должен буду использовать ToUpper и ToLower команд, но я действительно не знаю, как писать что-то, чтобы настроить каждый символ в строка. Любая помощь будет оценена по достоинству.

Спасибо.

+0

только комментарий для большинства отвечающими: Я думаю, что предложить алгоритм STL, основанный на итераторы и других машин C++ не является хорошим ответом для кого-то, кто спрашивает о верхней/нижней функции. Он/она является новичком C++. Вот почему я не упомянул 'std :: transform()', что является самым элегантным решением до сих пор. – Manu343726

+0

@ Manu343726, правда, но не каждый, кто приходит сюда, будет полным «новичком». –

ответ

4

Стандартная библиотека предоставляет функцию C std::toupper() и std::tolower(), которые возвращают верхний/нижний регистр указанного ASCII символа. Таким образом, ваша проблема может быть решена с помощью простого цикла:

if(!name.empty()) 
{ 
    name[0] = std::toupper(name[0]); 

    for(std::size_t i = 1 ; i < name.length() ; ++i) 
     name[i] = std::tolower(name[i]); 
} 
+0

'! Name.empty()' более эффективен, чем 'name.size()> 0' – Alex

+0

@Alex. Благодарю. Мы немного корректируем бит ответа. Это похоже на wiki :) – Manu343726

+0

Существуют также эквивалентные стандартные функции C++ ['std :: toupper'] (http://en.cppreference.com/w/cpp/locale/toupper) и [' std :: tolower '] (http://en.cppreference.com/w/cpp/locale/tolower), которые являются обертками вокруг соответствующих методов [' std :: ctype'] (http://en.cppreference.com/w/cpp/locale/ctype). – 0x499602D2

5

Простейшим решением является, возможно, первое слово в нижнем регистре, а затем сделать первый верхний регистр символов.

В стандартной библиотеке C++ имеется nice algorithms. Для этого я предлагаю std::transform вместе с std::tolower. И там, конечно, std::toupper для последней части:

std::transform(std::begin(name), std::end(name), std::begin(name), std::tolower); 
if (!name.empty()) 
    name[0] = std::toupper(name[0]); 
1

Предположит, что существует без пробелов в начале, вы можете использовать std::toupper() и std::tolower():

for (size_t i = 0; i < name.length(); i++) 
    name[i] = i==0? std::toupper(name[i]) : std::tolower(name[i]); 

более эффективный более кодом:

if (name.length()>0) 
{ 
    name[0] = std::toupper(name[0]) ; 
    for (size_t i = 1; i < name.length(); i++) 
     name[i] = std::tolower(name[i]); 
} 

И, наконец, этот код скипов первых пространства (если есть)

std::string capital(std::string name) 
{ 
    if (!name.empty()) 
    { 
     auto i = name.begin(); 

     while (i != name.end() && std::isspace(*i)) 
      ++i; 

     if (i == name.end()) 
      return name; 

     *i = std::toupper(*i++); 

     std::transform(i, name.end(), i, ::tolower); 
    } 

    return name; 
} 
2

Другим быстрое решение

#include <algorithm> 
#include <string> 

if (!name.empty()) // Edit : Add the verification 
{ 
    std::transform(name.begin(), name.end(), name.begin(), ::tolower); 
    name[0] = std::toupper(name[0]); 
} 
+3

Как @MM указал в моем ответе, что вызывает UB – Manu343726

+1

Я думаю, чтобы это действительно работало, мне пришлось бы переключаться вокруг строк 6 (name [0] ...) и 7 (std :: transform ...). – user2999339

+0

Вы совершенно правы, извините за ошибку! – jbouny