web-dev-qa-db-fra.com

Créer une chaîne avec un nombre spécifié de caractères

Existe-t-il un moyen de créer une chaîne de disons 256 caractères lors de l'initialisation avec c ++?

Une partie de mon devoir m'oblige à "1. Créer une chaîne de 256 caractères. Utilisez des répétitions de votre prénom".

Je ne suis pas tout à fait sûr de la façon de procéder autrement qu'en utilisant une boucle, mais je pense qu'il existe un moyen plus simple.

37
sircrisp

Jetons un œil à la référence constructeur de basic_string , on peut voir qu'il n'y a pas de moyen facile de répéter une chaîne complète . Pour un seul caractère, vous pouvez utiliser (2) comme ça:

std::string s(5, 'a'); // s == "aaaaa"

Pour générer une répétition de chaîne, vous aurez besoin d'une solution de contournement. Il est plus facile de faire cette post-construction en remplissant simplement la chaîne avec, par exemple, std::generate (s'amuser avec les algorithmes).

#include <string>
#include <algorithm>

// ...

std::string pattern("Xeo ");
auto pattern_it = pattern.begin();
std::string s(256, '\0');
std::generate(s.begin(), s.end(),
    [&]() -> char { 
      if(pattern_it == pattern.end())
        pattern_it = pattern.begin();
      return *pattern_it++; // return current value and increment
    });

exemple en direct.

92
Xeo

Si vous voulez une chaîne très longue, vous pouvez réduire le nombre de répétitions de boucle en doublant.

#include <string>
using std::string;

string repeatToLength ( unsigned len, string s ) {
  string r, si = s;

  // add all the whole multiples of s.
  for ( unsigned q = len / s.size(); q > 0; q >>= 1 ) {
    if ( q & 1 ) r += si; // add si to r if the low bit of q is 1
    si +=  si; // double si
  }
  r += s.substr ( 0, len - r.size() ); // add any remainder
  return r;
}
2
Daniel Patru
const string myName = "Blivit";
int numLeftOver = 256 % myName.length();

string Names;
for ( int Index = 0; Index < (256 / myName.length() ); ++Index ) {
   Names += myName;
}
Names += myName.substr(0, numLeftOver); 

C'est si vous souhaitez générer la chaîne. Je suis assez sûr qu'il existe un moyen plus court de le faire ...

1
bspikol

http://www.cplusplus.com/reference/string/string/

Autant que je sache, vous ne souhaitez réserver que 256 éléments.

Il n'y a pas de constructeur pour cela, et vous ne pouvez pas définir la capacité () à l'initialisation. Vous souhaitez probablement utiliser .reserve après l'initialisation. Attention réserve ():

Cela peut augmenter ou réduire la taille de l'espace de stockage dans la chaîne, bien que notez que la capacité résultante après un appel à cette fonction n'est pas nécessairement égale à res_arg mais peut être égale ou supérieure à res_arg, donc la réduction des demandes peut ou non produire une réduction réelle de l'espace alloué dans une implémentation de bibliothèque particulière.

Peut-être avez-vous besoin d'un type différent?

si vous voulez juste remplir votre chaîne, utilisez:

http://en.cppreference.com/w/cpp/string/basic_string/basic_string deuxième.

1
CyberGuy