La conversion en majuscules en C++
Disons que vous avez:
const char * something = "m";
Comment pourrait-on faire de cette majuscules, à l'aide de toupper (ou quelque chose d'autre, le cas échéant)?
Je veux utiliser un char *
au lieu d'un string
(je peux utiliser une chaîne de caractères, mais puis-je utiliser str.c_str()
).
Alors, comment puis-je faire char * something = "m";
contenir "M"
?
- Non, l'utilisation
std::string
. Et choisir une langue: il n'y a pas une telle chose comme "C/C++". - Et que voulez-vous faire avec
char something[] = "\xEF\xAC\x83";
? (c'est à dire ffi)
Vous devez vous connecter pour publier un commentaire.
Je vous trouve un choix de chaînes C inquiétant.. mais de toute façon.
Vous ne pouvez pas modifier une chaîne littérale (
char *something
). Essayez un tableau:Pour modifier une chaîne complète:
p
est superflu ici -- utilisationsomething
seulement et l'exemple sera beaucoup plus claire de l'OMI.Comme expliqué dans la très célèbre C livre -
The C Programming Language
parKernighan & Ritchie
dans la section5.5 Character Pointers and Functions
,Otoh, que, dans C, de convertir les lettres en majuscule, vous pouvez utiliser le programme suivant comme référence.
En C++
EDIT: Ajout de pointeur de version (comme demandé par @John) pour la version C
Espère que cela aide!
char
à la C toupper et d'autres fonctions prenant un caractère dans uneint
, il doit d'abord être converties en un unsigned char, puis à uneint
.Vous pouvez utiliser la même approche algorithmique que vous connaissez pour
std::string
pour les matières premières, les tableaux:Vous ne pouvez pas faire cela pour immuable littéraux de chaîne (comme
const char * s = "hello world;"
) pour des raisons évidentes, donc vous n'aurez pas autour d'une allocation supplémentaire/copie pour que.Mise à jour: Comme Ildjarn dit dans le commentaire, il est important de noter que les littéraux de chaîne sont toujours en lecture seule, même si pour des raisons historiques, vous êtes autorisé à les lier à un pointeur-à-muables, comme
char * s = "hello world";
. Tout bon compilateur C++ doit vous gifle dans le visage si vous essayez cela, mais il est valide en C++ -- mais toute tentative de fait modifier tout élément des
est un comportement indéterminé.char * s = "hello world;"
, sansconst
, est aussi immuable -- c'est une des premières raccrochage pour les débutants.toupper
qui vient avec<locale>
pour plus de solution générale.char
... soupirVous pouvez convertir C-string pour std::string et ensuite utiliser boost::to_upper pour changer de chaîne en place ou boost::to_upper_copy pour créer des majuscules copie de la chaîne. Voici l'exemple de code:
Espère que cette aide.
Que vous pouvez faire:
Cela s'applique la
::toupper
fonction de caractère de la chaîne. C'est le::toupper
fonction dans l'espace de noms global qui vient de C.std::toupper
a plusieurs surcharges et::toupper
ressemble de plus élégant questatic_cast<int (*)(int)>(&std::toupper)
.