第一个字母大写,其余字母小写
Capitalize the first letter, lower case the rest
我要求用户输入他们的名字,我想自动格式化名称,这样,无论他们如何输入名称,它都会显示为大写的第一个字母,其余部分为小写。例如,如果他们输入"joHN",程序仍将输出他们的名字为"John"。
我有以下代码用于他们的名字输入:
string name;
cout << "Please enter your first name: ";
cin >> name;
我假设我将不得不使用 toupper 和 tolower 命令,但我真的不确定如何编写一些东西来调整字符串中的每个字符。
标准库提供 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] );
}
最简单的解决方案可能是先使整个单词小写,然后将第一个字符设为大写。
C++标准库中有一些不错的算法。为此,我建议std::transform
与std::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]);
}
另一种快速解决方案
#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;
}
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- 将参数初始化为构造函数,而不是第一个
- 无法在硬件模式下创建 SGX 安全区 - "invalid launch token"即使文档将无效的启动令牌指定为第一个