17 votes

Multiplication d'une chaîne de caractères par un nombre entier en C++.

Qu'est-ce que je dois faire pour que quand je

string s = ".";

Si je le fais

cout << s * 2;

Est-ce que ce sera la même chose que

cout << "..";

?

63voto

JRG Points 835

Std::string a un constructeur de la forme

std::string(size_type count, char c);

qui répète le caractère. Par exemple

#include <iostream>

int main() {
   std::string stuff(2, '.');
   std::cout << stuff << std::endl;
   return 0;
}

produira

..

16voto

ForEveR Points 28133

Non, std::string n'a pas operator * . Vous pouvez ajouter (char, string) à une autre chaîne. Regardez ceci http://en.cppreference.com/w/cpp/string/basic_string

Et si vous voulez ce comportement (sans le conseiller), vous pouvez utiliser quelque chose comme ceci

#include <iostream>
#include <string>

template<typename Char, typename Traits, typename Allocator>
std::basic_string<Char, Traits, Allocator> operator *
(const std::basic_string<Char, Traits, Allocator> s, size_t n)
{
   std::basic_string<Char, Traits, Allocator> tmp = s;
   for (size_t i = 0; i < n; ++i)
   {
      tmp += s;
   }
   return tmp;
}

template<typename Char, typename Traits, typename Allocator>
std::basic_string<Char, Traits, Allocator> operator *
(size_t n, const std::basic_string<Char, Traits, Allocator>& s)
{
   return s * n;
}

int main()
{
   std::string s = "a";
   std::cout << s * 5 << std::endl;
   std::cout << 5 * s << std::endl;
   std::wstring ws = L"a";
   std::wcout << ws * 5 << std::endl;
   std::wcout << 5 * ws << std::endl;
}

http://liveworkspace.org/code/52f7877b88cd0fba4622fab885907313

16voto

pmtatar Points 113

J'ai utilisé la surcharge des opérateurs pour simuler ce comportement en c++.

#include <iostream>
#include <string>
using namespace std;

/* Overloading * operator */
string operator * (string a, unsigned int b) {
    string output = "";
    while (b--) {
        output += a;
    }
    return output;
}

int main() {
    string str = "abc";
    cout << (str * 2);
    return 0;
}

Sortie : abcabc

5voto

Ferruccio Points 51508

Il n'existe pas de * qui multipliera une chaîne de caractères par un int mais vous pouvez définir le vôtre :

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

string operator*(const string& s, unsigned int n) {
    stringstream out;
    while (n--)
        out << s;
    return out.str();
}

string operator*(unsigned int n, const string& s) { return s * n; }

int main(int, char **) {
    string s = ".";
    cout << s * 3 << endl;
    cout << 3 * s << endl;
}

2voto

Les chaînes de caractères ne peuvent pas être multipliées.

Si s est un caractère

'.'     // This has ASCII code 46

puis

cout << (char)((int)s * 2);

vous donnera

'/'     // This has ASCII code 92

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X