Respuestas:
En primer lugar, no use char*o char[N]. ¡Úselo std::string, entonces todo lo demás se vuelve tan fácil!
Ejemplos,
std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
Fácil, ¿no?
Ahora, si lo necesita char const *por alguna razón, como cuando desea pasar a alguna función, puede hacer esto:
some_c_api(s.c_str(), s.size());
asumiendo que esta función se declara como:
some_c_api(char const *input, size_t length);
Explore std::stringusted mismo comenzando desde aquí:
Espero que ayude.
Dado que es C ++, ¿por qué no usarlo en std::stringlugar de char*? La concatenación será trivial:
std::string str = "abc";
str += "another";
operator+=realiza tanto una desasignación como una asignación. Las asignaciones de montón se encuentran entre las operaciones más caras que hacemos habitualmente.
Si estaba programando en C, entonces asumiendo que namerealmente es una matriz de longitud fija como dice, debe hacer algo como lo siguiente:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
¿Ves ahora por qué todos recomiendan std::string?
Hay un strcat () de la biblioteca C portada que hará la concatenación de "cadenas de estilo C" por usted.
Por cierto, aunque C ++ tiene un montón de funciones para lidiar con cadenas de estilo C, podría ser beneficioso que intente crear su propia función que haga eso, 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;
}
...y entonces...
char s1[] = "file_name";
char *c = con(s1, ".txt");
... cuyo resultado es file_name.txt.
También puede tener la tentación de escribir el suyo propio, operator +sin embargo, el operador IIRC se sobrecarga con solo punteros, ya que no se permiten argumentos.
Además, no olvide que el resultado en este caso se asigna dinámicamente, por lo que es posible que desee llamar a eliminar para evitar pérdidas de memoria, o puede modificar la función para usar una matriz de caracteres asignada a la pila, siempre que, por supuesto, tenga la longitud suficiente.
strncat()función que suele ser una mejor alternativa
strncataquí es irrelevante, porque ya conocemos la longitud del segundo parámetro ".txt". Así sería strncat(name, ".txt", 4), lo que no nos gana nada.
strcat (destino, fuente) se puede utilizar para concatenar dos cadenas en c ++.
Para tener una comprensión profunda, puede buscar en el siguiente enlace:
Es mejor usar la clase de cadena C ++ en lugar de la cadena C de estilo antiguo, la vida sería mucho más fácil.
si tiene una cadena de estilo antiguo existente, puede convertirla en una clase de cadena
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;
}