Risposte:
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.
Dato che è C ++ perché non usarlo al std::stringposto di char*? La concatenazione sarà banale:
std::string str = "abc";
str += "another";
operator+=esegue sia una deallocazione che un'allocazione. Le allocazioni di heap sono tra le operazioni più costose che facciamo comunemente.
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?
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.
strncat()funzione che di solito è un'alternativa migliore
strncatqui è irrilevante, perché conosciamo già la lunghezza del secondo parametro ".txt". Quindi sarebbe solo strncat(name, ".txt", 4), il che non ci guadagna nulla.
strcat (destinazione, sorgente) può essere utilizzato per concatenare due stringhe in c ++.
Per avere una comprensione profonda puoi cercare nel seguente link-
È 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
//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;
}