Respostas:
Em primeiro lugar, não use char*ou char[N]. Use std::string, então tudo se torna tão fácil!
Exemplos,
std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
Fácil, não é?
Agora, se você precisar char const *por algum motivo, como quando deseja passar para alguma função, pode fazer o seguinte:
some_c_api(s.c_str(), s.size());
presumindo que esta função seja declarada como:
some_c_api(char const *input, size_t length);
Explore- std::stringse a partir daqui:
Espero que ajude.
Já que é C ++, por que não usar em std::stringvez de char*? A concatenação será trivial:
std::string str = "abc";
str += "another";
operator+=executa uma desalocação e uma alocação. As alocações de heap estão entre as operações mais caras que normalmente fazemos.
Se você estava programando em C, então presumindo que namerealmente é uma matriz de comprimento fixo como você diz, você deve fazer algo como o seguinte:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
Você vê agora por que todo mundo recomenda std::string?
Há uma função strcat () da biblioteca C portada que fará a concatenação de "string de estilo C" para você.
BTW, embora C ++ tenha um monte de funções para lidar com strings de estilo C, pode ser benéfico para você tentar criar sua própria função que faça isso, algo como:
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 depois...
char s1[] = "file_name";
char *c = con(s1, ".txt");
... o resultado disso é file_name.txt.
Você também pode ficar tentado a escrever seu próprio, operator +no entanto, o operador IIRC sobrecarrega apenas com ponteiros, pois os argumentos não são permitidos.
Além disso, não se esqueça de que o resultado neste caso é alocado dinamicamente, então você pode querer chamar delete nele para evitar vazamentos de memória, ou você pode modificar a função para usar array de caracteres de pilha alocada, desde que tenha comprimento suficiente.
strncat()função que geralmente é uma alternativa melhor
strncaté irrelevante aqui, porque já sabemos o comprimento do segundo parâmetro ".txt". Assim seria strncat(name, ".txt", 4), o que não nos ganha nada.
strcat (destino, origem) pode ser usado para concatenar duas strings em C ++.
Para ter um entendimento profundo, você pode pesquisar no seguinte link-
É melhor usar a classe string C ++ em vez da string C no estilo antigo, a vida seria muito mais fácil.
se você tem uma string de estilo antigo existente, você pode converter para a classe de 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
//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;
}