2013-03-10 28 views
48

Ho una variabile di classe privata (nome char [10]) a cui vorrei aggiungere l'estensione .txt in modo che possa aprire il file presente nella directory. Come faccio a fare questo? Sarebbe preferibile creare una nuova variabile stringa che contenga la stringa concatenata.Come concatenare due stringhe in C++?

risposta

86

Prima di tutto, non utilizzare 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, non è vero?

Ora, se avete bisogno di char const * per qualche motivo, ad esempio quando si desidera passare a qualche funzione, allora si può fare questo:

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

assumendo questa funzione è dichiarata come:

some_c_api(char const *input, size_t length); 

Esplora std::string te a partire da qui:

Spero che questo aiuti.

+0

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

+0

@ d34th4ck3r: è lineare. – Nawaz

11

Poiché è C++ perché non utilizzare std::string anziché char*? concatenazione sarà banale:

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

C'è una funzione strcat() dalla libreria C con porting che eseguirà la concatenazione "C style string" per voi.

BTW, anche se C++ ha un sacco di funzioni per trattare con le stringhe in stile C, potrebbe essere vantaggioso per voi provi e venire con la propria funzione che lo fa, qualcosa di simile:

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.

Si potrebbe anche essere tentati di scrivere il proprio operator + tuttavia sovraccarichi operatore IIRC con solo puntatori come argomenti non è consentito.

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 usare array di caratteri allocati nello stack, a condizione ovviamente ha una lunghezza sufficiente

+0

Vedere il mio commento alla risposta di IcyFlame. – TonyK

+3

C'è anche la funzione 'strncat()' che di solito è un'alternativa migliore – nogard

+0

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

6

Se stavate programmando in C, poi assumendo name davvero è un array di lunghezza fissa come dici, devi fare qualcosa di simile al seguente:

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

Vedete ora perché ognuno raccomanda std::string?

+1

Non vedi che il ragazzo ha fatto una domanda in C++ e non in C ?? – IcyFlame

+9

Non vedi che ho detto "Se stavi programmando ..."? – TonyK

+0

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

-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++; 
} 
return ;  
} 
int main( ){ 
char str1[100]; 
cin.getline(str1,100); 
char str2[100]; 
cin.getline(str2,100); 
stringconcat(str1,str2); 
cout<<str1; 
getchar(); 
return 0; 
} 
+1

.......... cosa sto vedendo? –

0

E 'meglio utilizzare C++ classe string, invece di stringa vecchio stile C, la vita sarebbe molto più facile.

se la stringa vecchio stile che avete esistente, è possibile convertire alla classe string

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