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. P>
3 Réponses :
à partir d'un Si vous essayez de créer une sous-chaîne à partir d'une chaîne de style C (A Nul-terminé contrairement à std :: string code>,
STD :: String :: SUBSTR CODE>
Créera un nouveau STD :: String Code> à 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.)
char code> tableau), puis vous pouvez utiliser le
STD :: String (Cons-Char * s, Taille_T n) Code>
constructeur. Par exemple: p> std :: string :: substr code>, le
std :: ficelle (const char * s, taille_t n ) code> 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. P> P>
Remarque, qui ne vérifie pas fin code> 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 code> auquel cas le code sera assez moche.
@YUGR @YUGR tandis que std :: string :: npos - Démarrer code> ne vous donnera pas la réelle i> longueur,
std :: string :: substr code> 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 code> 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 i> trivial due au débordement pour Démarrer == 0 && fin == std :: string :: npos code>).
@yugr c'est juste. Mais noter que vouloir un indice de fin inclusif et utiliser find == std :: string :: npos code> ne donne pas de sens ensemble en premier lieu. Quoi qu'il en soit, j'ai fait de légers ajustements à ma réponse.
std::string thesub = thestring.substr(start, end-start+1);
Cela ne fonctionnera pas si fin est std :: string :: npos code> (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 i> sur std :: string :: npos code>. De plus, comme je l'ai noté dans un autre commentaire, en utilisant
std :: string :: substr code> convient parfaitement à une longueur trop longue. Cette réponse a un cas d'angle d'être faux si
end == std :: string :: npos && start == 0 code> car la longueur de sous-chaîne envelopperait à 0, mais que l'échec est vraiment dû au
+1 code> (et c'est pourquoi il est presque toujours préférable d'utiliser un indice de fin exclusif i> exclusif i>).
1) Dans mon expérience en utilisant std :: string :: npos code> pour extraire la queue de chaîne est extrêmement courant et constitue également la complication principale de l'utilisation de
std :: substr code>. 2) Comme vous l'avez dit, la solution proposée échoue pour
start == 0 && fin == std :: string :: npos code> (c.-à-d.
substr code> retourne une chaîne entière) qui est un cas d'angle commun.
À la deuxième réflexion, si un indice de fin inclusif i> est souhaité, il devrait être une condition préalable que extrémité code> soit un index valide dans la chaîne existante et une valeur de
std :: string :: npos code> est absurde et doit être interdit.