8
votes

C ++ Split String tous les caractères x

J'essaie d'écrire une fonction qui prend une chaîne et scindre tous les x nombre de caractères: xxx

par exemple, si j'ai appelé DIFSLLIGEBNOMBY ("Bonjour!", 2) , je devrais obtenir un vecteur contenant: xxx

Cependant, il semble obtenir uniquement les deux premiers résultats (la taille du vecteur est 2), et lorsque Je fais quelque chose comme DimsplitsRingBynacher ("Bonjour", 2) , il se bloque, probablement parce qu'il tente d'accéder à un indice de réseau qui n'existe pas (il n'existe que 5). Y a-t-il un moyen plus simple de faire cela?


5 commentaires

Pourquoi aucune chaîne :: substr?


Les VLAS (tels que tampon de caractère [L] ) autorisé en C ++?


@barakmanos en C ++ 14 ou avec g ++, oui


@barakmanos Je ne me suis même pas réalisé que c'était une construction non standard. Je suppose que cela aurait dû être quelque chose comme char * tampon = nouveau char [l] ?


@Igor: Oui, c'est ce que j'utiliserais ... mais si ça marche pour toi, eh bien, que puis-je dire :) ... dans tous les cas, j'ai écrit une réponse (ci-dessous), suggérant comment vous devriez calculer la taille de votre vecteur.


4 Réponses :


6
votes

Cela divisera une chaîne en vecteur. S'il n'y a pas un nombre même de scissions, il ajoutera les caractères supplémentaires à la fin.

std::vector<std::string> Split(const std::string& str, int splitLength)
{
   int NumSubstrings = str.length() / splitLength;
   std::vector<std::string> ret;

   for (auto i = 0; i < NumSubstrings; i++)
   {
        ret.push_back(str.substr(i * splitLength, splitLength));
   }

   // If there are leftover characters, create a shorter item at the end.
   if (str.length() % splitLength != 0)
   {
        ret.push_back(str.substr(splitLength * NumSubstrings));
   }


   return ret;
}


0 commentaires

10
votes

Le cœur de l'algorithme revient vraiment aux deux lignes suivantes.

for (size_t i = 0; i < s.size(); i += l)
    res.push_back(s.substr(i, l));


1 commentaires

Cela fonctionne, mais ne semble pas être aussi rapide que la solution de Millsj.



3
votes

Utiliser cette STD :: String est une collection de caractères, une implémentation simple pourrait être la suivante: xxx

échantillon en direct


0 commentaires

2
votes

Modifier la façon dont vous calculez la taille du vecteur:

for (int i=0; i<size; i++)


0 commentaires