128 votes

Comment concaténer deux chaînes de caractères en C++ ?

J'ai une variable de classe privée char name[10] à laquelle je voudrais ajouter le .txt afin que je puisse ouvrir le fichier présent dans le répertoire.

Comment dois-je m'y prendre ?

Il serait préférable de créer une nouvelle variable de type chaîne qui contienne la chaîne concaténée.

194voto

Nawaz Points 148870

Tout d'abord, n'utilisez pas char* o char[N] . Utilisez std::string et tout le reste devient alors si facile !

Exemples,

std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!

Facile, n'est-ce pas ?

Maintenant, si vous avez besoin char const * pour une raison quelconque, comme lorsque vous voulez passer à une fonction, alors vous pouvez faire ceci :

some_c_api(s.c_str(), s.size()); 

en supposant que cette fonction est déclarée comme :

some_c_api(char const *input, size_t length);

Explorez std::string vous-même en partant d'ici :

J'espère que cela vous aidera.

37voto

nogard Points 4351

Puisqu'il s'agit de C++, pourquoi ne pas utiliser std::string au lieu de char* ? La concaténation sera triviale :

std::string str = "abc";
str += "another";

19voto

TonyK Points 8604

Si vous programmiez en C, alors en assumant name est vraiment un tableau de longueur fixe comme vous le dites, vous devez faire quelque chose comme ce qui suit :

char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...

Vous voyez maintenant pourquoi tout le monde recommande std::string ?

8voto

ddriver Points 4845

Il existe un strcat() de la bibliothèque C portée qui effectuera pour vous la concaténation de "chaînes de caractères de style C".

De plus, bien que le C++ dispose d'un grand nombre de fonctions pour traiter les chaînes de caractères de style C, il pourrait être bénéfique pour vous d'essayer de créer votre propre fonction, quelque chose du genre :

char * con(const char * first, const char * second) {
    int l1 = 0, l2 = 0;
    const char * f = first, * l = second;

    // step 1 - find lengths (you can also use strlen)
    while (*f++) ++l1;
    while (*l++) ++l2;

    char *result = new char[l1 + l2];

    // then concatenate
    for (int i = 0; i < l1; i++) result[i] = first[i];
    for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];

    // finally, "cap" result with terminating null char
    result[l1+l2] = '\0';
    return result;
}

...et puis...

char s1[] = "file_name";
char *c = con(s1, ".txt");

... dont le résultat est file_name.txt .

Vous pourriez également être tenté d'écrire votre propre operator + cependant, IIRC les surcharges d'opérateurs avec seulement des pointeurs comme arguments ne sont pas autorisées.

De plus, n'oubliez pas que le résultat dans ce cas est alloué dynamiquement, donc vous pourriez vouloir appeler delete sur lui pour éviter les fuites de mémoire, ou vous pourriez modifier la fonction pour utiliser un tableau de caractères alloué par la pile, à condition bien sûr qu'il ait une longueur suffisante.

2voto

S.M. Points 7691

C++14

std::string great = "Hello"s + " World"; // concatenation easy!

Réponse à la question :

auto fname = ""s + name + ".txt";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X