Come concatenare due stringhe in C ++?


100

Ho una variabile di classe privata char name[10]a cui vorrei aggiungere l' .txtestensione in modo da poter aprire il file presente nella directory.

Come posso procedere?

Sarebbe preferibile creare una nuova variabile di stringa che contenga la stringa concatenata.

Risposte:


160

Prima di tutto, non usare char*o char[N]. Usa std::string, quindi tutto il resto diventa così facile!

Esempi,

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

Facile no?

Ora se hai bisogno char const *per qualche motivo, ad esempio quando vuoi passare a qualche funzione, puoi farlo:

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

supponendo che questa funzione sia dichiarata come:

some_c_api(char const *input, size_t length);

Esplora std::stringte stesso partendo da qui:

Spero che aiuti.


3
Qual è la complessità temporale di questa concatenazione di stringhe?
d34th4ck3r

@ d34th4ck3r: è lineare.
Nawaz

30

Dato che è C ++ perché non usarlo al std::stringposto di char*? La concatenazione sarà banale:

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

1
Degno di nota, l'uso banale ha un prezzo non banale rispetto alle prestazioni di runtime. Il caso peggiore è che operator+=esegue sia una deallocazione che un'allocazione. Le allocazioni di heap sono tra le operazioni più costose che facciamo comunemente.
Rilevabile il

15

Se stavi programmando in C, supponendo nameche sia davvero un array a lunghezza fissa come dici, devi fare qualcosa del genere:

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

Capisci ora perché tutti consigliano std::string?


1
Non vedi che il ragazzo ha posto una domanda in c ++ e non in C ??
IcyFlame

21
Non vedi che ho detto "Se stessi programmando ..."?
TonyK

Non pensi che questa risposta sia irrilevante per questa domanda?
IcyFlame

9
Penso che questo sia rilevante poiché "il ragazzo" usa char invece di std :: string. Inoltre, mostra un modo esplicito di concatenazione che non è stato mostrato nella risposta più votata. Almeno ho imparato qualcosa con esso.
gvegayon

1
Questo mostra anche un metodo per eseguire una concatenazione di stringhe senza l'allocazione dinamica della memoria. A meno che non sbaglio, std :: string operator + = richiede una possibile riallocazione.
Ashley Duncan

7

C'è una funzione strcat () dalla libreria C portata che eseguirà la concatenazione di "stringhe in stile C" per te.

A proposito, anche se C ++ ha un sacco di funzioni per gestire le stringhe in stile C, potrebbe essere utile per te provare a trovare la tua funzione che lo fa, qualcosa come:

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;
}

...e poi...

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

... il cui risultato è file_name.txt.

Potresti anche essere tentato di scrivere i tuoi operator +sovraccarichi di operatori IIRC con solo puntatori poiché gli argomenti non sono consentiti.

Inoltre, non dimenticare che il risultato in questo caso è allocato dinamicamente, quindi potresti voler chiamare delete su di esso per evitare perdite di memoria, oppure potresti modificare la funzione per utilizzare l'array di caratteri allocato nello stack, a condizione ovviamente che abbia una lunghezza sufficiente.


Vedi il mio commento alla risposta di IcyFlame.
TonyK

3
C'è anche una strncat()funzione che di solito è un'alternativa migliore
nogard

@nogard: strncatqui è irrilevante, perché conosciamo già la lunghezza del secondo parametro ".txt". Quindi sarebbe solo strncat(name, ".txt", 4), il che non ci guadagna nulla.
TonyK


0

È meglio usare la classe stringa C ++ invece della stringa C vecchio stile, la vita sarebbe molto più semplice.

se hai una stringa vecchio stile esistente, puoi convertirla in una classe stringa

    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string
    string trueString = string (greeting);
    cout << trueString + "and there \n"; // compiles fine
    cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too

0

C ++ 14

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

Risposta alla domanda:

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

-2
//String appending
#include <iostream>
using namespace std;

void stringconcat(char *str1, char *str2){
    while (*str1 != '\0'){
        str1++;
    }

    while(*str2 != '\0'){
        *str1 = *str2;
        str1++;
        str2++;
    }
}

int main() {
    char str1[100];
    cin.getline(str1, 100);  
    char str2[100];
    cin.getline(str2, 100);

    stringconcat(str1, str2);

    cout<<str1;
    getchar();
    return 0;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.