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

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

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

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

5 ответов

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

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

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

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

но также не забудьте:

#include <string>
#include <cctype>

все вплоть до

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

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

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

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

(Работает только с символами 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;
Другие вопросы по тегам