我一直在搜索和搜索,但没有找到这个问题的答案。我要求用户输入他们的名字,我想自动格式化名称,这样无论他们如何输入名称,它都会显示为大写第一个字母,小写则显示其余部分。例如,如果他们输入“joHN”,程序仍然会输出他们的名字“John”。
我的名字输入有以下代码:
string name;
cout << "Please enter your first name: ";
cin >> name;
我假设我将不得不使用toupper和tolower命令,但我真的不确定如何编写一些东西来调整字符串中的每个字符。任何帮助将不胜感激。
感谢。
答案 0 :(得分: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 :(得分:4)
标准库提供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] );
}
答案 2 :(得分: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 :(得分: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;
}