C++ vérifier si la chaîne est l'espace ou la valeur null
Fondamentalement, j'ai de la chaîne d'espaces " "
ou de blocs d'espace ou ""
vide dans certaines des lignes les fichiers et je voudrais savoir si il existe une fonction en C++ qui vérifie ce.
*note:* Que d'un côté de la question, en C++, si j'ai envie de casser une corde vers le bas et vérifier le modèle de la bibliothèque qui dois-je utiliser? Si je veux le coder moi-même les fonctions de base dois-je savoir pour manipuler la chaîne? Existe-il des bonnes références?
Un grand nombre de réponses affichées semblent être à côté de la clause "ou de blocs d'espace". Je pense que l'idée est de trouver des lignes ne contenant que des zéro plus espaces, où le "ou plus" pourrait être supérieur à 1.
Cette partie de la question est un (inutile, OMI) des précisions ajoutées après que la plupart des réponses. Une "chaîne" est déjà une séquence de caractères, pas limité à un seul. Mais bon, j'ai essayé de donner une réponse à l'origine de cela, et a obtenu vilipendé par la fondation, pour autant, l'entrée est au format ASCII (qui est bien plus raisonnable de supposer que celui qu'il fait, de l'OMI). Donc, ma réponse va languir en bas pour toujours. C'est ok, je n'ai pas besoin de la rep. Je pars en cas, Marc apprécie une réponse qui fonctionne réellement.
Désolé 'bout que je n'ai pas essayer de "fustiger". C'est juste qu'un grand nombre de novices code incorrect simples appels à
Et j'ai immédiatement reconnu que vous aviez raison sur le risque de dépassement de la valeur négative et les problèmes associés. La plupart des novices ne serait probablement profiter de dit que
Cette partie de la question est un (inutile, OMI) des précisions ajoutées après que la plupart des réponses. Une "chaîne" est déjà une séquence de caractères, pas limité à un seul. Mais bon, j'ai essayé de donner une réponse à l'origine de cela, et a obtenu vilipendé par la fondation, pour autant, l'entrée est au format ASCII (qui est bien plus raisonnable de supposer que celui qu'il fait, de l'OMI). Donc, ma réponse va languir en bas pour toujours. C'est ok, je n'ai pas besoin de la rep. Je pars en cas, Marc apprécie une réponse qui fonctionne réellement.
Désolé 'bout que je n'ai pas essayer de "fustiger". C'est juste qu'un grand nombre de novices code incorrect simples appels à
isspace
et de la famille. Je pense donc qu'il est Très Important de corriger l'simpliste des appels partout où ils apparaissent, de sorte que les gens de la lecture il peut apprendre comment appeler ces fonctions correctement (et quel est le danger de ne pas appeler directement).Et j'ai immédiatement reconnu que vous aviez raison sur le risque de dépassement de la valeur négative et les problèmes associés. La plupart des novices ne serait probablement profiter de dit que
isspace
n'est pas garanti pour fonctionner de la manière dont ils s'attendent à des caractères étendus.OriginalL'auteur Mark | 2011-06-12
Vous devez vous connecter pour publier un commentaire.
Puisque vous n'avez pas spécifié de l'interprétation de personnages >
0x7f
, je suis en supposant que le code ASCII (c'est à dire pas avec des caractères dans la chaîne).std::isspace
. l'argument doit être castée pourunsigned char
(ou l'équivalent de l'expression). veuillez les corriger.Casting pour
unsigned char
ne serait pas correct non plus. Lorsque vous démarrer la prise en charge des caractères non-ASCII, vous avez besoin de savoir l'encodage, commencer à penser à des caractères multi-octets, etc.J'ai résolu de ne jamais passer les nombres négatifs à
std::isspace
. Pensez vous qu'il y a encore un problème?oui, il y a encore un problème, à savoir l'incapacité à reconnaître que les espaces une valeur négative, comme
char
. C'est que la fonction puisse produire un faux négatif. Tout simplement jeté àunsigned char
à résoudre, pour l'encodage par défaut (l'argument est alors implicitement encouragés àint
, mais l'effet n'est pas le même directement jeté àint
: vous jette àunsigned char
).Quelle partie de "Si c'est pas de l'ASCII, vous devez tenir compte des caractères multi-octets" n'est pas claire? Cette fonction est écrit (et maintenant documenté) pour travailler correctement sur les chaînes ASCII. Si l'entrée n'est pas ASCII, la logique serait de (1) l'encodage-dépendante et (2) beaucoup plus compliqué. Une troupe de
unsigned char
n'est pas un correctif approprié.OriginalL'auteur Ben Voigt
OriginalL'auteur Jonathan Grynspan
OriginalL'auteur Tyler Davis
La rupture d'une chaîne vers le bas,
std::stringstream
peut être utile.OriginalL'auteur jonsca
Vous n'avez pas de nullstring "dans certaines des lignes les fichiers".
Mais vous pouvez avoir une chaîne vide, c'est à dire une ligne vide.
Vous pouvez utiliser, par exemple,
std::string.length
, ou si vous aimez C mieux,strlen
fonction.Afin de vérifier les espaces, les
isspace
fonction est pratique, mais notez que pourchar
personnages que l'argument doit être castée pourunsigned char
, par exemple, en improvisant,Cheers & hth.,
unsigned char
est généralement pas la bonne chose à faire avec les chaînes ASCII.Positif, vous avez bien compris que la fonction ne gère pas une chaîne de caractères. Il gère un
char
. Vous n'avez pas compris le but de la fonte. Ce n'est pas une bonne idée de remplir ce vide par une hypothèse de "à l'aveugle de casting". Cette distribution est nécessaire pour éviter un Comportement Indéfini, en général. Il illustre l'utilisation de cette fonction & famille correctement. Cheers & hth.,Vous remplacez un comportement indéfini avec probablement un mauvais comportement. par exemple, la plupart des caractères non-ASCII sont représentés en UTF-8 ces jours-ci, et
::isspace
va faire la mauvaise chose si vous passer UTF-8 octet en tête.Votre argument, si elle est correcte, s'appliquerait à la plupart de la norme C++ de la bibliothèque de manipulation des caractères... 🙁 Traitant avec l'encodage UTF-8 et d'autres de la longueur variable des codages est beaucoup plus difficile, parce que la bibliothèque standard a une taille fixe hypothèse. La fonction ci-dessus est la plus efficace et la plus générale de la fonction. En tant que tel, il peut être enveloppé avec toutes les conditions que vous voulez, au prix de l'efficacité. Dans l'autre sens, la production de l'efficace et la plus générale de la fonction à partir d'une fonction limitée, est en général impossible. En essence, vous ne pouvez pas vous débarrasser de l'inefficacité une fois que vous l'ajouter à fond.
AFAICT, tous de la norme C++ de la bibliothèque de manipulation des caractères n'est spécifié que pour le jeu de caractères de base, ce qui signifie ASCII sur toutes les plateformes actuelles. La manipulation de caractères OEM > 0x7f est complètement mise en œuvre définies et non portable. C++ n'a même pas de préciser quelle est la plage de valeurs valides pour un caractère, (sauf qu'il est certainement un sur-ensemble strict de 0 à 127)
OriginalL'auteur Cheers and hth. - Alf
Si vous souhaitez motif cochant l'option utiliser les regexp.
il a demandé "si j'ai envie de casser une corde vers le bas et vérifier le modèle de la bibliothèque devrais-je utiliser"
Comme une "question". Un Débordement de pile ne font pas "du côté des questions". Et "regexp" n'est pas une bibliothèque. C'est une description générale d'un large éventail de moteurs d'expressions Régulières, mis en œuvre par un large éventail de bibliothèques.
OriginalL'auteur Dani