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.
y += d;
Je voudrais utiliser l'opérateur +=
au lieu de fonctions nommées.
Utilisez Push_back()
:
std::string y("Hello worl");
y.Push_back('d')
std::cout << y;
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;
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');
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
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.
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?
Essayez d’utiliser le d comme pointeur Y.append (* d)
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);
.
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.
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