26

我有一个字符串:"apple"。如何仅将第一个字符转换为大写并以 的形式获取新字符串"Apple"

我也可以有一个带有多字节字符的字符串。

如果字符串的第一个字符是多字节字符怎么办?

4

5 回答 5

51
string str = "something";
str[0] = toupper(str[0]);

这就是你需要做的。它也适用于 C 字符串。

于 2011-12-16T06:27:41.073 回答
9

正如卡内基所说,

string str = "something";
str[0] = toupper(str[0]);

但也要记住:

#include <string>
#include <cctype>

一路攀升

于 2013-02-17T01:48:11.007 回答
8

我不能使用 str[0] 因为,我可以有包含多字节字符的字符串

我不知道任何支持非 ASCII 字符分类和转换的 CRT 实现。如果您想支持 Unicode,那么一切都会复杂得多,因为“将第一个字符转换为大写”在其他语言中可能毫无意义。为此,您必须使用专家编写的Unicode 库。

为了说明它有多复杂,请考虑以下英语案例。转换三个代码点序列“文件”(带有 fi 连字)应将一个代码点分成两个单独的字母,从而产生“文件”。请注意,用于进行案例分类和转换的标准 C/C++ 接口没有考虑到这种情况,因此甚至无法实现它们以正确支持 Unicode。

于 2011-12-16T06:41:10.890 回答
4
#include <iostream>
using namespace std;

void capitalize (string &s)
{
    bool cap = true;

    for(unsigned int i = 0; i <= s.length(); i++)
    {
        if (isalpha(s[i]) && cap == true)
        {
            s[i] = toupper(s[i]);
            cap = false;
        }
        else if (isspace(s[i]))
        {  
            cap = true;
        }
    }
}
于 2013-01-24T05:13:18.273 回答
3

(仅适用于“ASCII”字符。)

std::wstring s = L"apple";

if(islower(s.at(0) <= 'z' ? s.at(0) : 'A'))
    s[0] += 'A' - 'a';

或者,如果您觉得花哨并想折磨您代码的任何未来读者:

std::wstringstream wss;
wss << std::uppercase   << s[0]
    << std::nouppercase << s.substr(1);
wss >> s;
于 2011-12-16T06:25:57.267 回答