nombres - concatenar en c++ char
concatenar matriz de caracteres en C (6)
Tengo una matriz char
char* name = "hello";
Quiero agregar una extensión a ese nombre para hacerlo
hello.txt
¿Cómo puedo hacer esto?
name += ".txt"
no funcionará
Tengo una matriz de char:
char* name = "hello";
No, tienes un puntero de carácter a un literal de cadena . En muchos usos, puede agregar el modificador const, dependiendo de si le interesan más los nombres , o el valor de cadena, " hola ". No debes intentar modificar el literal ("hola"), porque pueden pasar cosas malas .
Lo más importante que se debe transmitir es que C no tiene un tipo de cadena adecuado (o de primera clase ). Las "cadenas" suelen ser matrices de caracteres (caracteres) con un carácter nulo de terminación (''/ 0'' o decimal 0) para indicar el final de una cadena o punteros a matrices de caracteres.
Sugeriría leer Arrays de caracteres , sección 1.9 en El lenguaje de programación C (página 28 segunda edición). Recomiendo leer este pequeño libro (<300 páginas), para aprender C.
Además de su pregunta, las secciones 6 - Arrays y punteros y la sección 8 - Caracteres y cadenas de la C Preguntas frecuentes pueden serle de ayuda. Las preguntas 6.5 y 8.4 pueden ser buenos lugares para comenzar.
Espero que esto te ayude a entender por qué tu extracto no funciona. Otros han descrito qué cambios son necesarios para que funcione. Básicamente, necesita una matriz de caracteres (una matriz de caracteres) lo suficientemente grande como para almacenar la cadena completa con un carácter ''/ 0'' que termina (termina). Luego puede usar la función de biblioteca de C estándar strcpy (o mejor aún strncpy) para copiar el "Hola" en ella, y luego quiere concatenar usando la función estándar de la biblioteca C strcat (o mejor aún strncat). Deberá incluir el archivo de encabezado string.h para declarar las declaraciones de funciones.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
char filename[128];
char* name = "hello";
char* extension = ".txt";
if (sizeof(filename) < strlen(name) + 1 ) { /* +1 is for null character */
fprintf(stderr, "Name ''%s'' is too long/n", name);
return EXIT_FAILURE;
}
strncpy(filename, name, sizeof(filename));
if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1) ) {
fprintf(stderr, "Final size of filename is too long!/n");
return EXIT_FAILURE;
}
strncat(filename, extension, (sizeof(filename) - strlen(filename)) );
printf("Filename is %s/n", filename);
return EXIT_SUCCESS;
}
Echa un vistazo a la función strcat .
En particular, puedes probar esto:
const char* name = "hello";
const char* extension = ".txt";
char* name_with_extension;
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */
Puede copiar y pegar una respuesta aquí, o puede leer lo que nuestro anfitrión Joel tiene que decir sobre strcat .
asprintf
no es 100% estándar, pero está disponible a través de las bibliotecas C estándar de GNU y BSD, por lo que probablemente lo tenga. Asigna la salida, por lo que no tiene que sentarse allí y contar los caracteres.
char *hi="Hello";
char *ext = ".txt";
char *cat;
asprintf(&cat, "%s%s", hi, ext);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *name = "hello";
int main(void) {
char *ext = ".txt";
int len = strlen(name) + strlen(ext) + 1;
char *n2 = malloc(len);
char *n2a = malloc(len);
if (n2 == NULL || n2a == NULL)
abort();
strlcpy(n2, name, len);
strlcat(n2, ext, len);
printf("%s/n", n2);
/* or for conforming C99 ... */
strncpy(n2a, name, len);
strncat(n2a, ext, len - strlen(n2a));
printf("%s/n", n2a);
return 0; // this exits, otherwise free n2 && n2a
}