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é dans google, ce que je pouvais voir sont juste "char array to char ptr", "char ptr to char array", etc.
Réponses:
J'utiliserais un
+=
opérateur au lieu de fonctions nommées.la source
gcc
,basic_string::operator+=
est juste un appelpush_back
.y
c'est unchar*
au lieu destd::string
. Cela ajouterait desd
caractères au pointeur y.Utilisez
push_back()
:la source
Pour ajouter un caractère à un var std :: string à l'aide de la méthode append, vous devez utiliser cette surcharge:
Edit: Vous avez raison, j'ai mal compris le paramètre size_type, affiché dans l'aide contextuelle. Il s'agit du nombre de caractères à ajouter. Donc le bon appel est
ne pas
Ou de la manière la plus simple:
la source
sizeof(char)
au lieu de1
? Vous voulez ajouter exactement une répétition ded
, alors dites-le simplement. L'utilisationsizeof
ici est trompeuse car elle suggère que l'on doit indiquerappend
la taille en octets du type de données utilisé (ce qui n'est pas le cas).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.
la source
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.
Selon ce test, les résultats sont:
Conclusion
+=
semble plus compréhensible, mais si la vitesse vous préoccupe, utilisez appendla source
Essayez l'opérateur + = texte du lien , méthode append () le texte du lien , ou méthode push_back () texte du lien
Les liens de cet article contiennent également des exemples d'utilisation des API respectives.
la source
le problème avec:
est que vous devez avoir le 'd' par opposition à l'utilisation d'un nom de caractère, comme char d = 'd'; Ou ai-je tort?
la source
char c = 'd'
et je peux le fairey.push_back(c)
sans problème. Il n'y a donc pas de problème avecstd::string::push_back()
(sauf que c'est plus long que+=
).Notez que dans tous ces exemples que vous auriez pu utiliser un littéral de caractère directement:
y += 'd';
.Votre deuxième exemple aurait presque fonctionné, pour des raisons indépendantes.
char d[1] = { 'd'};
n'a pas fonctionné, maischar d[2] = { 'd'};
(note du tableau est de taille deux) aurait été travaillé à peu près la même queconst char* d = "d";
, et un littéral de chaîne peut être jointe:y.append(d);
.la source
Essayez d'utiliser le d comme pointeur y.append (* d)
la source
char
n'est pas une chaîne et n'a pas de terminateur nul. Cela provoque un comportement indéfini.*d
signifie un pointeur de dé-référenced
qui est une erreur de syntaxe card
n'est pas un pointeur.Remarquez que j'ai écrit 10u et non 10 pour le nombre de fois où j'aimerais ajouter le caractère; remplacez 10 par n'importe quel nombre.
la source
J'ai trouvé un moyen simple ... J'avais besoin de clouer un
char
sur une corde qui était construite à la volée. J'avais besoin d'unchar list;
car je donnais un choix à l'utilisateur et en utilisant ce choix dans unswitch()
déclaration.J'ai simplement ajouté une autre
std::string Slist;
et défini la nouvelle chaîne égale au caractère, "liste" - a, b, c ou tout ce que l'utilisateur final choisit comme ceci:La complexité peut être cool mais la simplicité est plus cool. A mon humble avis
la source
Ajout également une option d'insertion, comme pas encore mentionné.
la source
Si vous utilisez le push_back, il n'y a pas d'appel pour le constructeur de chaîne. Sinon, il créera un objet chaîne via la conversion, puis il ajoutera le caractère de cette chaîne à l'autre chaîne. Trop de problèmes pour un petit personnage;)
la source