web-dev-qa-db-ja.com

文字列の最初の文字を大文字に変換します

文字列"Apple"があります。最初の文字のみを大文字に変換し、"Apple"の形式で新しい文字列を取得するにはどうすればよいですか?

マルチバイト文字を含む文字列を使用することもできます。

文字列の最初の文字がマルチバイト文字の場合はどうなりますか?

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

あなたがする必要があるのはそれだけです。 C文字列でも機能します。

43
Seth Carnegie

Str [0]を使用できないのは、マルチバイト文字を含む文字列を使用できるためです

非ASCII文字の分類と変換をサポートするCRT実装を知りません。 Unicodeをサポートする場合、「最初の文字を大文字に変換する」ことは他の言語では意味がないため、すべてがはるかに複雑になります。このために専門家によって書かれた nicodeライブラリ を使用する必要があります。

それがどれほど複雑かを説明するために、Englishの次のケースを考えてみましょう。 threeコードポイントシーケンス「ファイル」(fi合字)の変換は、break最初のコードポイントがtwoの個別の文字になり、「ファイル」になります。ケースの分類と変換を行うための標準C/C++インターフェイスでは、このようなケースは考慮されないため、Unicodeを正しくサポートするように実装することさえできないことに注意してください。

7
ybungalobill

カーネイギーが言ったことのように、

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

ただし、次のことも忘れないでください。

#include <string>
#include <cctype>

すべての方法まで

6
HoKy22

(「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;
3
Mateen Ulhaq
#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;
        }
    }
}
3
Rye Bryant