Преобразование первой буквы в строку в верхний регистр

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Чтобы проиллюстрировать, насколько это сложно, рассмотрите следующий случай на английском языке. Преобразование трех кодовой последовательности "fi" (с f-i-лигатурой) должно разбить первый код на два отдельных письма, в результате чего "Файл". Обратите внимание, что стандартные интерфейсы C/С++ для классификации и преобразования случаев не учитывают такие случаи, поэтому их даже невозможно реализовать для правильной поддержки Unicode.

Ответ 3

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

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

но также помните:

#include <string>
#include <cctype>

до конца

Ответ 4

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

Ответ 5

#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;
        }
    }
}