Я искал и искал и не нашел ответа на этот вопрос. Я прошу пользователя ввести свое имя, и я хочу автоматически отформатировать имя, чтобы независимо от того, как они вводили имя, оно отображалось как заглавная первая буква, а остальные строчные. Например, если они введут «joHN», программа все равно выведет их имя как «John».
У меня есть следующий код для ввода их имени:
string name;
cout << "Please enter your first name: ";
cin >> name;
Я предполагаю, что мне придется использовать команды toupper и tolower, но я действительно не уверен, как написать что-то для настройки каждого символа в строке. Любая помощь будет оценена.
Благодарю.
Стандартная библиотека обеспечивает функции 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] );
}
Самое простое решение, вероятно, состоит в том, чтобы сначала сделать все слово строчными, а затем сделать первый символ заглавными.
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]);
Другое быстрое решение
#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]);
}
Предположим, что нет пробелов в начале, вы можете использовать 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;
}