concatenar matriz de caracteres en C

2 minutos de lectura

concatenar matriz de caracteres en C
usuario69514

Tengo una matriz de caracteres:

char* name = "hello";

Quiero agregar una extensión a ese nombre para hacerlo

hello.txt

¿Cómo puedo hacer esto?

name += ".txt" no funcionará

1647536287 159 concatenar matriz de caracteres en C
david bajo la colina

Echa un vistazo a la strcat función.

En particular, podrías intentar 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 */

  • ¡No olvides liberar nombre_con_extensión!

    – Nick Presta

    7 de febrero de 2010 a las 21:04

  • puedes por favor escribir const char *name, *extension? Un literal de cadena es no a char *.

    – efímero

    7 de febrero de 2010 a las 22:03

  • Un poco nuevo en C, pero ¿qué pasa con el +1+4 en malloc(strlen(nombre)+1+4) Supongo que el +4 son los 4 caracteres adicionales, pero ¿cuál es el +1?

    – Jackie

    3 de junio de 2013 a las 20:38

  • El +1 es para tener en cuenta el terminador nulo al final de la cadena.

    – torcido98

    15 de octubre de 2013 a las 1:10

  • @lopside98 ¿por qué no? sizeof(char) ¿Usó ese conteo de bytes real? p.ej malloc(strlen(name) + 4 * sizeof(char) + 1)

    –Joseph Persie III

    3 de enero de 2017 a las 13:47

concatenar matriz de caracteres en C
mctylr

Tengo una matriz de caracteres:

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 está más interesado en lo que nombre apunta a, o el valor de la cadena, “Hola“. No debe intentar modificar el literal (“hola”), porque pueden pasar cosas malas.

Lo más importante que hay que transmitir es que C no tiene un nombre propio (o primera clase) tipo de cadena. Las “cadenas” suelen ser conjuntos de caracteres (caracteres) con un carácter nulo de terminación (‘\ 0’ o 0 decimal) para indicar el final de una cadena o punteros a conjuntos de caracteres.

Sugiero leer Matrices de caracteressección 1.9 en El lenguaje de programación C (página 28 segunda edición). Recomiendo encarecidamente leer este pequeño libro (<300 páginas), para aprender C.

Además de su pregunta, las secciones 6 – Matrices y punteros y la sección 8 – Caracteres y cadenas de El Preguntas frecuentes podría ayudar. Pregunta 6.5y 8.4 podrían ser buenos lugares para comenzar.

Espero que eso te ayude a entender por qué tu extracto no funciona. Otros han esbozado 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 de terminación (finalización) ‘\ 0’. Luego puede usar la función de biblioteca C estándar strcpy (o mejor aún strncpy) para copiar el “Hola” en él, y luego desea concatenar usando la función strcat de biblioteca C estándar (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;
}

  • Esta es una solución mejor que la seleccionada por el OP: no usa malloc (la memoria asignada en la pila se reasignará después de que se ejecute la rutina) y tiene muchas buenas comprobaciones de errores.

    – Casey

    3 de marzo de 2019 a las 0:10


  • @nmnir Tienes toda la razón. Estaba tratando de decir que debido a que la respuesta seleccionada por OP usa malloc, no es ideal, en parte porque usa memoria en el montón. Por el contrario, esta respuesta es mejor porque no usa malloc y, por lo tanto, su memoria se asignará en la pila y se reasignará después de que se ejecute la rutina. Mi uso de paréntesis fue ambiguo y es demasiado tarde para editarlo. Considere este comentario como una aclaración.

    – Casey

    30 de diciembre de 2020 a las 19:18


concatenar matriz de caracteres en C
salv0

Primero copie la cadena actual a una matriz más grande con estresanteluego usa strcat.

Por ejemplo puedes hacer:

char* str = "Hello";
char dest[12];

strcpy( dest, str );
strcat( dest, ".txt" );

asprintf no es 100% estándar, pero está disponible a través de las bibliotecas estándar C de GNU y BSD, por lo que probablemente lo tenga. Asigna la salida, por lo que no tiene que sentarse allí y contar caracteres.

char *hi="Hello";
char *ext = ".txt";
char *cat;

asprintf(&cat, "%s%s", hi, ext);

Puede copiar y pegar una respuesta aquí, o puede ir a leer lo que nuestro anfitrión Joel tiene que decir sobre strcat.

1647536289 888 concatenar matriz de caracteres en C
Estudiante CASO

Puede concatenar cadenas utilizando la función sprintf(). En tu caso, por ejemplo:

char file[80];
sprintf(file,"%s%s",name,extension);

Y terminará teniendo la cadena concatenada en “archivo”.

en casos raros cuando no puede usar strncat, strcat o strcpy. Y tú no tengo acceso para <string.h> entonces no puedes usar strlen. Además, es posible que ni siquiera sepa el tamaño de las matrices de caracteres y aún desee concatenar porque solo obtuvo punteros. Bueno, puedes hacer la vieja escuela. malloc y cuente los caracteres usted mismo como ..

char *combineStrings(char* inputA, char* inputB) {
    size_t len = 0, lenB = 0;
    while(inputA[len] != '\0') len++;
    while(inputB[lenB] != '\0') lenB++;
    char* output = malloc(len+lenB);
    sprintf((char*)output,"%s%s",inputA,inputB);
    return output;
}

solo necesita #include <stdio.h> que probablemente ya habrás incluido

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad