11
votes

C ++: Comment construire des chaînes / char *

Je suis nouveau à C ++. Je veux faire un char * , mais je ne sais pas comment.
En Java, c'est juste ceci: xxx

Comment puis-je faire cela? J'ai besoin d'un char * .

Je me concentre sur coller l'entier après la chaîne.


3 commentaires

Qu'est-ce que vous essayez de faire exactement? Vous avez besoin d'une méthode qui prend un char * et fait quoi avec elle? Vous contradurez votre exemple plus tard dans votre message. S'il vous plaît soyez clair sur ce dont vous avez besoin exactement.


Étant donné que vous êtes adorant à ne pas utiliser C ++ Constructs, vous devez supprimer le C ++ de votre question et poser plutôt une question à propos de C. À quelle heure vous pouvez accepter la réponse Sprintf.


Non, votre compilateur n'est pas cassé.


6 Réponses :


2
votes

juste appeler s.c_tr (); . Ici vous pouvez voir plus.

ps. Vous pouvez utiliser Strcpy pour copier le contenu à une nouvelle variable, puis vous pourrez le changer.


4 commentaires

Mais alors je reçois un const char * et j'ai besoin char * . J'ai essayé avec const_cast (str) , mais cela donne une erreur dans les bibliothèques C ++.


Je vous suggère d'élaborer plus de ce que vous essayez de faire ici.


essayez const_cast (str.c_str ())


L'erreur que je reçois lors de la compilation est affichée ici: Stackoverflow.com/Questtions/2289168/...



1
votes

Char * code> signifie "pointeur sur un caractère".

Vous pouvez créer un pointeur sur une "chaîne" comme ceci: p> xxx pré>

Sinon, vous pouvez utiliser STD :: String: P>

const char* = "My long string";


0 commentaires

0
votes

Considérez avec Stringstreams:

#include <iostream>
#include <sstream>

using namespace std;
int main ()
{
    int i = 10;

    stringstream t;

    t << "test " << i;

    cout << t.str();
}


2 commentaires

Mais cela retournera la chaîne et non de char *.


Je pense que cout << const_cast (t.str (). C_STR ()); retournera le char * qu'il a besoin, cependant, c'est assez laid. Si l'OP doit avoir un char *, je suggère la solution Sprintf postée par Rupert Jones.



38
votes

Vous ne voulez certainement pas gérer de char * si vous pouvez l'aider - vous avez besoin de la classe C ++ STD :: String Class:

#include <sstream>
#include <string>
#include <iostream>
using namespace std;

int main() {

  int player = 0;
  int cpu = 0;

  ostringstream os;
  os << "You: " << player << " CPU: " << cpu;
  string s = os.str();
  cout << s << endl;
}


3 commentaires

D'accord avec tout sauf le dernier commentaire ... Il existe des assez excellentes ressources et des tutoriels C ++ en ligne, y compris "Un débutant C ++", "Learn C ++ en 21 jours", "PARASTIFT C ++ FAQ Lite" et "Leçons AVANCÉE C ++". Bien sûr, la pratique est également nécessaire.


En ce qui concerne la requête Char * ... En supposant que la fonction ne va pas écrire dans la chaîne, il est possible d'utiliser const_cast (S.C_STR ()) pour convertir S.C_STR () - qui est de type const Char * - à un objet de type Char *. Cependant, c'est très piraqué. Ce serait mieux, si possible, de modifier la signature de l'autre fonction pour utiliser le type Const Char * ou, encore mieux, const std :: string &.


Appuyant @michaelaaronsafyan concernant le dernier commentaire. J'ai appris C ++ par moi-même, avec peu d'expérience de programmation et je suis devenu assez compétent avant d'acheter un seul livre. J'aimerais ajouter LearnCPPP.com à la liste - c'est peut-être la meilleure introduction sur le net, imo.



8
votes

Si vous travaillez avec C ++, utilisez simplement std :: string . Si vous travaillez avec Char * , vous voulez probablement travailler avec C directement. Dans le cas de C, vous pouvez utiliser la fonction sprintf : xxx


2 commentaires

Je suis très nouveau. Comment dois-je initialiser s ?


Par exemple, avec Char S [50] pour 49 caractères (+ 0 caractère pour la terminaison de chaîne) ou Char * s = nouveau caractère [50] pour une allocation dynamique.



0
votes

Cela aurait probablement été pour le mieux si C ++ avait surchargé l'opérateur "+" comme vous montrez. Malheureusement, ils ne l'ont pas (vous pouvez cependant, si vous voulez).

Il existe fondamentalement trois méthodes pour la conversion des variables entières à chaînes en C ++; deux hérités de C et d'un nouveau pour C ++.

  1. Le ITOA () routine. Ceci est en fait non standard, mais la plupart des compilateurs l'ont. La bonne chose à ce sujet est qu'il renvoie un pointeur sur la chaîne, il peut donc être utilisé dans la programmation de style fonctionnel.
  2. sprintf () . La deuxième hausse de C, cette routine prend une chaîne de destination, une chaîne de format et une liste de paramètres. Combien de paramètres, il y a, et la façon dont ils sont interprétés dépendent de la façon dont la chaîne « format » Parsis. Cela rend le sprintf immensément puissant et immensément dangereux. Si vous utilisez cette approche, je peux une garantie à peu près que vous aurez des bugs de crash vos premiers essais.
  3. std :: ostringstream . La manière C ++. Cela a à peu près tout le pouvoir de Sprintf (), mais est beaucoup plus sûr. L'inconvénient est que vous devez le déclarer, et c'est pas une chaîne, vous devez donc toujours la convertir en un lorsque vous avez terminé. Cela signifie au moins trois lignes de code sont nécessaires pour faire quoi que ce soit avec un ostringstream. Il est également vraiment moche, en particulier si vous essayez de formatage spécial.

0 commentaires