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.
12 réponses
y += d;
J'utiliserais l'opérateur +=
au lieu des fonctions nommées.
Utiliser push_back()
:
std::string y("Hello worl");
y.push_back('d')
std::cout << y;
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;
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');
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
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.
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?
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);
.
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.
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
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 ;)