Comment ajouter un caractère à une chaîne std::?

Suivantes é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 aussi essayé, ce qui suit, qui compile mais se comporte aléatoirement à 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é dans google, ce que j'ai pu voir sont juste "char tableau de char ptr", "char ptr char array", etc.

125
demandé sur Alexis Wilke 2009-09-24 18:26:09

12 réponses

y += d;

J'utiliserais l'opérateur += au lieu des fonctions nommées.

165
répondu AraK 2009-09-24 14:29:28

Utiliser push_back():

std::string y("Hello worl");
y.push_back('d')
std::cout << y;
48
répondu Ferdinand Beyer 2009-09-24 14:28:46

Pour ajouter un char à un std:: string var en utilisant 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 du contexte. C'est le nombre de caractères à ajouter. Donc, l'appel correct est

s.append(1, d);

Pas

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

Ou la manière la plus simple:

s += d;
16
répondu Patrice Bernassola 2009-09-24 15:42:50

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

std::string s = "hell";
s += std::string(1, 'o');
7
répondu Brian R. Bondy 2009-09-24 14:33:05

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 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 vous souciez de la vitesse, utilisez append

6
répondu Hugo Zevetel 2017-06-28 12:34:47

Essayer de l'opérateur + = texte du lien, méthode append () Texte du lien , ou la méthode push_back () texte du lien

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

5
répondu Michael Berg 2009-09-24 14:30:48

Le problème avec:

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

Est-ce que vous devez avoir le 'd' par opposition à l'utilisation d'un nom de char, comme char d = 'd'; ou Ai-je tort?

1
répondu Alex Spencer 2012-06-25 06:14:28
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 un caractère littéral directement: y += 'd';.

Votre deuxième exemple presque aurait fonctionné, pour des raisons non liées. char d[1] = { 'd'}; n'a pas fonctionné, mais char d[2] = { 'd'}; (notez que le tableau est de taille deux) aurait été travaillé à peu près comme const char* d = "d";, et un littéral de chaîne Peut être ajouté: y.append(d);.

1
répondu Mooing Duck 2013-06-11 17:55:25

Essayez d'utiliser le d comme pointeur y.append(*d)

1
répondu 2ndless 2014-03-04 22:04:25
str.append(10u,'d'); //appends character d 10 times

Notez que j'ai écrit 10u {[3] } et non 10 pour le nombre de fois où je voudrais ajouter le caractère; remplacez 10 par n'importe quel nombre.

0
répondu Ioan Stef 2013-06-11 18:13:24

J'ai trouvé un moyen simple... J'avais besoin de piquer un char sur une chaîne qui était en cours de construction à la volée. J'avais besoin d'un char list; parce que je donnais à l'utilisateur un choix et que j'utilisais ce choix dans une instruction switch().

J'ai simplement ajouté un autre std::string Slist; et défini la nouvelle chaîne égale au caractère, "list" - a, b, c ou tout 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. IMHO

0
répondu Charles H 2018-09-13 15:18:22

Si vous utilisez le push_back il n'y a pas d'appel pour la chaîne constructeur. Sinon, il créera un objet string via le casting, puis il ajoutera le caractère de cette chaîne à l'autre chaîne. Trop de problèmes pour un petit personnage ;)

-1
répondu progician 2009-09-24 14:49:31