web-dev-qa-db-fra.com

Comment ajouter un caractère à un std :: string?

Ce qui suit échoue avec l'erreur prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’

int main()
{
  char d = 'd';
  std::string y("Hello worl");
  y.append(d); // Line 5 - this fails
  std::cout << y;
  return 0;
}

J'ai également essayé, ce qui suit, qui compile mais se comporte de manière aléatoire au moment de l'exécution:

int main()
{
  char d[1] = { 'd' };
  std::string y("Hello worl");
  y.append(d);
  std::cout << y;
  return 0;
}

Désolé pour cette question stupide, mais j'ai cherché sur Google, ce que je pouvais voir ne sont que "tableau de caractères à ptr de caractères", "caractère ptr à tableau de caractères", etc.

143
drowneath
y += d;

Je voudrais utiliser l'opérateur += au lieu de fonctions nommées.

181
AraK

Utilisez Push_back():

std::string y("Hello worl");
y.Push_back('d')
std::cout << y;
53
Ferdinand Beyer

Pour ajouter un caractère à une variable std :: string à l'aide de la méthode append, vous devez utiliser cette surcharge:

std::string::append(size_type _Count, char _Ch)

Modifier: Vous avez raison, j'ai mal compris le paramètre size_type, affiché dans l'aide contextuelle. C'est le nombre de caractères à ajouter. Donc, le bon appel est

s.append(1, d);

ne pas

s.append(sizeof(char), d);

Ou la manière la plus simple:

s += d;
17
Patrice Bernassola

En plus des autres mentionnés, l'un des constructeurs de chaîne prend un caractère et le nombre de répétitions pour ce caractère. Vous pouvez donc l'utiliser pour ajouter un seul caractère.

std::string s = "hell";
s += std::string(1, 'o');
9
Brian R. Bondy

Je teste les différentes propositions en les exécutant dans une grande boucle ... J'ai utilisé Microsoft Visual Studio 2015 comme compilateur et mon processeur est un processeur i7, 8Hz, 2GHz.

    long start = clock();
    int a = 0;
    //100000000
    std::string ret;
    for (int i = 0; i < 60000000; i++)
    {
        ret.append(1, ' ');
        //ret += ' ';
        //ret.Push_back(' ');
        //ret.insert(ret.end(), 1, ' ');
        //ret.resize(ret.size() + 1, ' ');
    }
    long stop = clock();
    long test = stop - start;
    return 0;

Selon ce test, les résultats sont:

     operation             time(ms)            note
------------------------------------------------------------------------
append                     66015
+=                         67328      1.02 time slower than 'append'
resize                     83867      1.27 time slower than 'append'
Push_back & insert         90000      more than 1.36 time slower than 'append'

Conclusion

+= semble plus compréhensible, mais si vous faites attention à la vitesse, utilisez append

7
Hugo Zevetel

Essayez le + = opérateur lien texte , Méthode append () lien texte , .__ ou méthode Push_back () lien texte

Les liens de ce message contiennent également des exemples d'utilisation des API respectives.

6
Michael Berg

le problème avec:

std::string y("Hello worl");
y.Push_back('d')
std::cout << y;

est-ce que vous devez avoir le 'd' au lieu d'utiliser un nom de char, comme char d = 'd'; Ou ai-je tort?

2
Alex Spencer

Essayez d’utiliser le d comme pointeur Y.append (* d)

2
2ndless
int main()
{
  char d = 'd';
  std::string y("Hello worl");

  y += d;
  y.Push_back(d);
  y.append(1, d); //appending the character 1 time
  y.insert(y.end(), 1, d); //appending the character 1 time
  y.resize(y.size()+1, d); //appending the character 1 time
  y += std::string(1, d); //appending the character 1 time
}

Notez que dans tous ces exemples, vous auriez pu utiliser directement un littéral de caractère: y += 'd';.

Votre deuxième exemple presque aurait fonctionné, pour des raisons indépendantes. char d[1] = { 'd'}; n'a pas fonctionné, mais char d[2] = { 'd'}; (notez que le tableau a une taille égale à deux) aurait été travaillé à peu près de la même façon que const char* d = "d"; et qu'un littéral de chaîne can soit ajouté: y.append(d);.

1
Mooing Duck
str.append(10u,'d'); //appends character d 10 times

Notez que j’ai écrit 10u et non 10 pour le nombre de fois où j’aimerais ajouter le caractère; remplacez 10 par un nombre quelconque.

0
Ioan Stef

J'ai trouvé un moyen simple ... Je devais attacher une char à une chaîne qui était construite à la volée. J'avais besoin d'un char list; parce que je donnais un choix à l'utilisateur et que je l'utilisais dans une instruction switch().

J'ai simplement ajouté un autre std::string Slist; et défini la nouvelle chaîne sur le caractère "liste" - a, b, c ou peu importe ce que l'utilisateur final choisit comme ceci:

char list;
std::string cmd, state[], Slist;
Slist = list; //set this string to the chosen char;
cmd = Slist + state[x] + "whatever";
system(cmd.c_str());

La complexité peut être cool mais la simplicité est plus cool. A mon humble avis

0
Charles H