9
votes

Copier une sous-chaîne d'une chaîne indice de fin de chaîne

Comment puis-je copier une sous-chaîne d'une chaîne donnée avec l'index de démarrage et de fin ou de donner l'index de démarrage et la longueur de la chaîne est donnée.

c++

0 commentaires

3 Réponses :


12
votes

à partir d'un std :: string , STD :: String :: SUBSTR Créera un nouveau STD :: String à partir d'un indice de démarrage et d'une longueur. Il devrait être trivial pour déterminer la longueur nécessaire étant donné l'indice de fin. (Si l'indice de fin est inclusif au lieu d'exclusif, il convient de veiller à ce qu'il s'agisse d'un index valide dans la chaîne.)

Si vous essayez de créer une sous-chaîne à partir d'une chaîne de style C (A Nul-terminé char tableau), puis vous pouvez utiliser le STD :: String (Cons-Char * s, Taille_T n) constructeur. Par exemple: xxx

contrairement à std :: string :: substr , le std :: ficelle (const char * s, taille_t n ) constructeur peut lire après la fin de la chaîne d'entrée. Dans ce cas, vous devez donc vérifier d'abord que l'indice final est valide.


5 commentaires

Remarque, qui ne vérifie pas fin après la fin de la chaîne C.


"Il devrait être trivial pour déterminer la longueur nécessaire étant donné l'indice de fin" - uniquement si l'indice final! = std :: string :: npos auquel cas le code sera assez moche.


@YUGR @YUGR tandis que std :: string :: npos - Démarrer ne vous donnera pas la réelle longueur, std :: string :: substr gagné 't soin; La longueur est autorisée à dépasser la fin. C'est est vrai que cela ne fonctionnerait pas dans l'affaire C-String, mais il ne serait pas approprié d'utiliser std :: string :: npos pour cette situation.


Ma principale préoccupation est le «trivial de déterminer la longueur nécessaire étant donné la pièce de l'indice de fin (car la longueur de détermination lorsque l'indice de fin est inclus, c'est pas trivial due au débordement pour Démarrer == 0 && fin == std :: string :: npos ).


@yugr c'est juste. Mais noter que vouloir un indice de fin inclusif et utiliser find == std :: string :: npos ne donne pas de sens ensemble en premier lieu. Quoi qu'il en soit, j'ai fait de légers ajustements à ma réponse.



7
votes
std::string thesub = thestring.substr(start, end-start+1);

4 commentaires

Cela ne fonctionnera pas si fin est std :: string :: npos (qui est le but principal de la question).


@yugr Je ne vois pas où vous obtenez "l'objectif principal de la question" de, qui indique rien sur std :: string :: npos . De plus, comme je l'ai noté dans un autre commentaire, en utilisant std :: string :: substr convient parfaitement à une longueur trop longue. Cette réponse a un cas d'angle d'être faux si end == std :: string :: npos && start == 0 car la longueur de sous-chaîne envelopperait à 0, mais que l'échec est vraiment dû au +1 (et c'est pourquoi il est presque toujours préférable d'utiliser un indice de fin exclusif exclusif ).


1) Dans mon expérience en utilisant std :: string :: npos pour extraire la queue de chaîne est extrêmement courant et constitue également la complication principale de l'utilisation de std :: substr . 2) Comme vous l'avez dit, la solution proposée échoue pour start == 0 && fin == std :: string :: npos (c.-à-d. substr retourne une chaîne entière) qui est un cas d'angle commun.


À la deuxième réflexion, si un indice de fin inclusif est souhaité, il devrait être une condition préalable que extrémité soit un index valide dans la chaîne existante et une valeur de std :: string :: npos est absurde et doit être interdit.



0
votes

Vous pouvez utiliser SUBSTR Méthode OD STD: Classe de cordes. < / p>


0 commentaires