web-dev-qa-db-fra.com

Convertir la première lettre de la chaîne en majuscules

J'ai une chaîne: "Apple". Comment puis-je convertir uniquement le premier caractère en majuscules et obtenir une nouvelle chaîne sous la forme de "Apple"?

Je peux également avoir une chaîne avec des caractères multi-octets.

Que faire si le premier caractère de la chaîne est un caractère multi-octets?

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

C'est tout ce que vous devez faire. Cela fonctionne également pour les chaînes C.

43
Seth Carnegie

Je ne peux pas utiliser str [0] car je peux avoir une chaîne contenant des caractères multi-octets

Je ne connais aucune implémentation CRT qui prend en charge la classification et la conversion des caractères non ASCII. Si vous voulez prendre en charge Unicode, alors tout est beaucoup plus compliqué, car "convertir le premier caractère en majuscules" peut ne pas avoir de sens dans d'autres langues. Vous devez utiliser une bibliothèque Unicode écrite par des experts pour cela.

Pour illustrer à quel point c'est compliqué, considérons le cas suivant en anglais . La conversion des trois fichiers de séquence de points de code (avec fi ligature) doit rompre le premier point de code en deux lettres distinctes résultant en 'File'. Veuillez noter que les interfaces C/C++ standard pour effectuer la classification et la conversion des cas ne prennent pas en compte de tels cas, il est donc même impossible de les implémenter pour prendre en charge Unicode correctement.

7
ybungalobill

Comme ce que Carneigie a dit,

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

mais n'oubliez pas non plus:

#include <string>
#include <cctype>

tout en haut

6
HoKy22

(Fonctionne uniquement avec les caractères 'ASCII'.)

std::wstring s = L"Apple";

if(islower(s.at(0) <= 'z' ? s.at(0) : 'A'))
    s[0] += 'A' - 'a';

Ou si vous vous sentez chic et que vous avez envie de torturer les futurs lecteurs de votre code:

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