Convertir une seule de caractères en minuscules, en C++ - tolower retourne un entier
Je suis en train de convertir une chaîne de caractères en minuscules, et je suis le traiter comme un char* et itérer sur chaque index. Le problème est que le tolower
fonction que j'ai lu sur des sites en ligne ne sont pas réellement de convertir un char en minuscules: c'est la prise de char en entrée et retourne un entier.
cout << tolower('T') << endl;
imprime 116
à la console alors qu'il devrait être l'impression T
.
Est-il un meilleur moyen pour moi de convertir une chaîne en minuscules?
J'ai regardé autour de ligne, et la plupart des sources de dire à "utilisation tolower
et parcourir le char array", qui ne semble pas être de travailler pour moi.
Donc mes deux questions sont:
- Ce que je fais de mal avec le
tolower
fonction qui fait ce qu'il revienne 116 au lieu de " t " quand je l'appelletolower('T')
- Sont t-il de meilleures façons de convertir une chaîne de caractères en minuscules, en C++, autres que l'aide
tolower
sur chaque personnage?
OriginalL'auteur user83676 | 2015-11-21
Vous devez vous connecter pour publier un commentaire.
C'est parce qu'il y a deux différents
tolower
fonctions. Celui que vous utilisez est cette une, qui retourne unint
. C'est pourquoi c'est l'impression 116. C'est la valeur ASCII de't'
. Si vous souhaitez imprimer unchar
, vous pouvez simplement le jeter en arrière pour unchar
.Sinon, vous pouvez utiliser cette une, qui renvoie en fait le type que vous attendez le retour d':
En réponse à votre deuxième question:
Nope.
En fait, il y a d'autres façons de convertir une chaîne en minuscules. Par exemple, la différence entre un ASCII 'T' et 't' est 0x20. Donc, si l'on Sro ou ajouter 0x20 à une majuscule ASCII de la lettre, la lettre va devenir minuscule. Encore une fois, cela est vrai pour ASCII alphabets. Si vous avez besoin d'autres pages de code, cette méthode ne fonctionnera pas. Si c'est "mieux" dépend de l'environnement et du projet.
OriginalL'auteur Barry
116 est, en effet, la valeur correcte, cependant c'est simplement une question de savoir comment
std::cout
manipule des entiers, utilisezchar(tolower(c))
pour atteindre vos résultats souhaitésOriginalL'auteur user4578093
C'est encore plus étrange que celui - elle prend un
int
et renvoie unint
. Voir http://en.cppreference.com/w/cpp/string/byte/tolower.Vous devez vous assurer que la valeur que vous avez pass il est représentable comme un
unsigned char
- pas de valeurs négatives sont autorisées même sichar
est signé.Donc, vous pourriez vous retrouver avec quelque chose comme ceci:
Moche n'est-ce pas? Mais dans tous les cas de la conversion d'un caractère à la fois est très limitant. Essayez la conversion de 'ß' en majuscules, par exemple.
OriginalL'auteur Alan Stokes
À la baisse est int de sorte qu'il retourne int. Si vous cochez
#include <ctype>
vous verrez que la définition estint tolower ( int c );
Vous pouvez utiliser la boucle à travers la chaîne et de changer chaque char à lowe cas. Par exempleint
àchar
.OriginalL'auteur Nikola Butigan
la documentation de
int to_lower(int ch)
mandats que le ch doit être représentable comme ununsigned char
ou doit être égale àEOF
(qui est généralement -1, mais ne comptez pas sur qu').Il n'est pas rare de caractères les fonctions de manipulation qui ont été héritées de la bibliothèque c standard pour le travail en termes d'entiers. Il y a deux raisons à cela:
Dans les premiers jours de C, tous les arguments ont été promus en int (prototypes de fonction n'existe pas).
Pour la cohérence de ces fonctions ont besoin pour manipuler les expressions du FOLKLORE cas, qui pour des raisons évidentes, ne peut pas être une valeur représentable par un
char
, car cela signifierait que nous aurions perdre l'un de la légitime encodages de caractères.http://en.cppreference.com/w/cpp/string/byte/tolower
La réponse est à jeter le résultat d'un char avant l'impression.
par exemple:
OriginalL'auteur Richard Hodges