Преобразовать первую букву в строке в верхний регистр - PullRequest
19 голосов
/ 16 декабря 2011

У меня есть строка: "apple". Как я могу преобразовать только первый символ в верхний регистр и получить новую строку в виде "Apple"?

У меня также может быть строка с многобайтовыми символами.

Что, если первый символ строки является многобайтовым?

Ответы [ 5 ]

41 голосов
/ 16 декабря 2011
string str = "something";
str[0] = toupper(str[0]);

Это все, что тебе нужно сделать. Это также работает для строк C.

7 голосов
/ 16 декабря 2011

Я не могу использовать str [0], потому что у меня может быть строка с многобайтовыми символами

Я не знаю ни одной реализации CRT, которая поддерживает классификацию и преобразование не-ASCII символов,Если вы хотите поддерживать Unicode, тогда все гораздо сложнее, поскольку «преобразование первого символа в верхний регистр» может быть бессмысленным в других языках.Для этого вам нужно использовать библиотеку Unicode , написанную экспертами.

Чтобы проиллюстрировать, насколько это сложно, рассмотрим следующий случай в English .Преобразование трех последовательности кодовых точек 'file' (с лигатурой) должно разбить первую кодовую точку на две отдельные буквы, в результате чего получается "File".Обратите внимание, что стандартные интерфейсы C / C ++ для классификации случаев и преобразования не учитывают такие случаи, поэтому даже невозможно реализовать их для правильной поддержки Юникода.

6 голосов
/ 17 февраля 2013

Как и то, что сказал Карнейдж,

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

, но также не забывайте:

#include <string>
#include <cctype>

вплоть до

3 голосов
/ 24 января 2013
#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 голосов
/ 16 декабря 2011

(Работает только с символами 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;
...