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 ライブラリを使用する必要があります。

それがいかに複雑かを説明するために、英語で次のケースを考えてみましょう。3 つのコード ポイント シーケンス 'file' (ファイル付き) を変換する、最初のコードポイントが2 つの別個の文字に分割され、'File' になります。大文字と小文字の分類と変換を行うための標準の 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 に答える