0

我要求用户输入他们的姓名,并且我想自动格式化姓名,以便无论他们如何输入姓名,它都会显示为大写的第一个字母,其余部分小写。例如,如果他们输入“joHN”,程序仍会将他们的姓名输出为“John”。

我有以下代码用于他们的姓名输入:

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

我假设我将不得不使用 toupper 和 tolower 命令,但我真的不确定如何编写一些东西来调整字符串中的每个字符。

4

4 回答 4

5

最简单的解决方案可能是先将整个单词变为小写,然后将第一个字符变为大写。

C++在标准库中有一些不错的算法。为此,我建议std::transformstd::tolower. 当然还有std::toupper最后一部分:

if (!name.empty())
{
    std::transform(std::begin(name), std::end(name), std::begin(name),
                   [](char const& c)
                   {
                      return std::tolower(c);
                   });

    name[0] = std::toupper(name[0]);
}
于 2013-11-16T13:26:21.700 回答
5

标准库提供 C 函数std::toupper()std::tolower()返回指定 ASCII 字符的大写/小写。所以你的问题可以通过一个简单的 for 循环来解决:

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] );
}
于 2013-11-16T13:26:34.977 回答
2

假设开头没有空格,您可以使用std::toupper()and 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;
}
于 2013-11-16T13:27:14.760 回答
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]);
}
于 2013-11-16T13:30:58.767 回答