Прописать первую букву, строчные — остальные.

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

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

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

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

Благодарю.

0

Решение

Стандартная библиотека обеспечивает функции 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] );
}
4

Другие решения

Самое простое решение, вероятно, состоит в том, чтобы сначала сделать все слово строчными, а затем сделать первый символ заглавными.

C ++ имеет некоторые хорошие алгоритмы в стандартной библиотеке. Для этого я предлагаю 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]);
5

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

#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]);
}
2

Предположим, что нет пробелов в начале, вы можете использовать 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;
}
1
По вопросам рекламы [email protected]